您的位置:首页 > 移动开发 > Android开发

[M0]按键多次点击检测(原理)

2016-03-08 00:00 351 查看
摘要: 【原创工作记录,如需转载,请注明出处,谢谢配合!】
检测按键连续多次点击,判断是否构成双击、三击等,从而执行相应的功能。

【原创工作记录,如需转载,请注明出处,谢谢配合!】

最近接到一个重新定义耳机按键键功能的需求,其中Hook键集4个功能于一身,着实折腾了一番。

最后在同事的指点下,想到了采用handler的延时消息机制。

思路如下:

按钮点击,捕获事件,计数器+1,如果时间间隔大于延时时间,那么上一次的消息就已经触发了,上一次连击事件就判定结束了,此时将计数器置为0,重新开始计数;如果时间间隔小于延时时间,那么先将上一次发出的消息(此时还未被触发)remove掉,然后重新发送新的消息。大致流程图如下:(画的不好,不准确,理解下)

免费在线流程图绘制工具



简单的实现过程如下:

// 两次点击之间的最大时间间隔,也就是消息延迟的时间;
// 一旦时间超过之后,上一次的消息就被触发了,那么连击也就结束了。
private final static long DELAY_MILLIS = 1000;
// 最多点击次数
private final static int MAX_COUNTS = 3;
// 用来发送延迟消息,每次发送之前,都要先将上一次消息remove掉,否则上一次消息仍旧会被触发。
// 记录点击次数
private int clickCounts = 0;

// 处理连击事件
private Runnable runnable = new Runnable() {
@Override
public void run() {
textView.append("\nclickCounts = " + clickCounts);
// 连击事件被消费之后,重置点击次数
clickCounts = 0;
// 还原按钮状态
button.setText("Click me " + clickCounts);
button.setClickable(true);
}
};


public void btnClicked(View view) {
// 点击次数大于最大次数,将按钮置为不可点击状态,
// 避免出现按钮点击了,但次数没+1出现
if(clickCounts >= MAX_COUNTS){
button.setClickable(false);
return;
}

// 点击次数+1
clickCounts++;
button.setText("Click me " + clickCounts);

// 点击次数小于最大次数,remove上一次的消息(此时还未被触发),发送新的消息.
// 如果两次事件间隔大于DELAY_MILLIS,那么上一次的消息就已经被触发了,
// 此时再发出的消息会当作一次新的连击处理
button.removeCallbacks(runnable);
button.postDelayed(runnable, DELAY_MILLIS);
}


【原创工作记录,如需转载,请注明出处,谢谢配合!】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 连击检测