对于单击和连击 ,最基本的区别就是“单击是每次点击的时间间隔超过连击的有效范围,而连击是每次点击的时间间隔都在连击的有效范围内”。(PS:个人观点,有不妥的欢迎指正)

所以要想判断是否是连击,就得定义一个连击的有效范围 interval(一个长整型变量)

private long interval = 500;

在每次点击的时候判断与上一次点击的时间间隔是否符合 interval(即时间间隔小于或等于interval),不符合的,可能是连击的开始,

也可能仅仅是单击,所以我们的连击计数器 count (一个整型变量)的值是 1,如果符合的话,就累加 count

@Overridepublic voidonClick(View v) {long secondTime =System.currentTimeMillis();//判断每次点击的事件间隔是否符合连击的有效范围//不符合时,有可能是连击的开始,否则就仅仅是单击
if (secondTime - firstTime <=interval) {++count;
}else{
count= 1;
}//延迟,用于判断用户的点击操作是否结束
delay();
firstTime=secondTime;
}

为了判断用户是否点击完毕,每次点击后,都会重置一个延时时钟,当用户结束点击事件后,该延时时钟就会如愿的运行起来,

//延迟时间是连击的时间间隔有效范围
private voiddelay() {if (task != null)
task.cancel();
task= newTimerTask() {
@Overridepublic voidrun() {
Message message= newMessage();//message.what = 0;
handler.sendMessage(message);
}
};
delayTimer= newTimer();
delayTimer.schedule(task, interval);
}
并调用我们定义的点击事件处理函数。
//点击事件结束后的事件处理
handler = newHandler() {
@Overridepublic voidhandleMessage(Message msg) {if (count == 1) {
tvCount.setText("单击事件");
}else if (count > 1) {
tvCount.setText("连续点击事件,共点击了 " + count + " 次");
}
delayTimer.cancel();
count= 0;super.handleMessage(msg);
}
};

因为在这里讲的是一个记录连击次数的,所以就只显示是单击还是连击及连击次数。

完整的类代码如下:

packagecom.chuanye.lianjidemo;importandroidx.appcompat.app.AppCompatActivity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.os.SystemClock;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;importandroid.widget.Toast;importjava.util.Timer;importjava.util.TimerTask;public class MainActivity extends AppCompatActivity implementsView.OnClickListener {private Button btClick = null;private TextView tvCount = null;private int count = 0;private long firstTime = 0;privateTimer delayTimer;privateHandler handler;privateTimerTask task;private long interval = 500;privateButton btClick11;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btClick=(Button) findViewById(R.id.btClick);
btClick.setOnClickListener(this);
tvCount=(TextView) findViewById(R.id.tvCount);//点击事件结束后的事件处理
handler = newHandler() {
@Overridepublic voidhandleMessage(Message msg) {if (count == 1) {
tvCount.setText("单击事件");
}else if (count > 1) {
tvCount.setText("连续点击事件,共点击了 " + count + " 次");
}
delayTimer.cancel();
count= 0;super.handleMessage(msg);
}
};
}
@Overridepublic voidonClick(View v) {switch(v.getId()){caseR.id.btClick11:
continuousClick(COUNTS, DURATION);break;caseR.id.btClick:long secondTime =System.currentTimeMillis();//判断每次点击的事件间隔是否符合连击的有效范围//不符合时,有可能是连击的开始,否则就仅仅是单击
if (secondTime - firstTime <=interval) {++count;
}else{
count= 1;
}//延迟,用于判断用户的点击操作是否结束
delay();
firstTime=secondTime;break;
}
}//延迟时间是连击的时间间隔有效范围
private voiddelay() {if (task != null)
task.cancel();
task= newTimerTask() {
@Overridepublic voidrun() {
Message message= newMessage();//message.what = 0;
handler.sendMessage(message);
}
};
delayTimer= newTimer();
delayTimer.schedule(task, interval);
}
}

布局文件如下:

android:id="@+id/tvCount"android:layout_width="match_parent"android:layout_height="40dp"android:gravity="center"/>
android:id="@+id/btClick"android:layout_width="80dp"android:layout_height="40dp"android:layout_marginTop="60dp"android:layout_gravity="center"android:text="点击" />

结束