对于单击和连击 ,最基本的区别就是“单击是每次点击的时间间隔超过连击的有效范围,而连击是每次点击的时间间隔都在连击的有效范围内”。(PS:个人观点,有不妥的欢迎指正)
所以要想判断是否是连击,就得定义一个连击的有效范围 interval(一个长整型变量)
private long interval = 500;
在每次点击的时候判断与上一次点击的时间间隔是否符合 interval(即时间间隔小于或等于interval),不符合的,可能是连击的开始,也可能仅仅是单击,所以我们的连击计数器 count (一个整型变量)的值是 1,如果符合的话,就累加 count
@Override
public void onClick(View v) {
long secondTime = System.currentTimeMillis();
// 判断每次点击的事件间隔是否符合连击的有效范围
// 不符合时,有可能是连击的开始,否则就仅仅是单击
if (secondTime - firstTime <= interval) {
++count;
} else {
count = 1;
}
// 延迟,用于判断用户的点击操作是否结束
delay();
firstTime = secondTime;
}
为了判断用户是否点击完毕,每次点击后,都会重置一个延时时钟,当用户结束点击事件后,该延时时钟就会如愿的运行起来,
// 延迟时间是连击的时间间隔有效范围
private void delay() {
if (task != null)
task.cancel();
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
// message.what = 0;
handler.sendMessage(message);
}
};
delayTimer = new Timer();
delayTimer.schedule(task, interval);
}
并调用我们定义的点击事件处理函数。
// 点击事件结束后的事件处理
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (count == 1) {
tvCount.setText("单击事件");
} else if (count > 1) {
tvCount.setText("连续点击事件,共点击了 " + count + " 次");
}
delayTimer.cancel();
count = 0;
super.handleMessage(msg);
}
};
因为在这里讲的是一个记录连击次数的,所以就只显示是单击还是连击及连击次数。
完整的类代码<MainActivity.java>如下:
package com.example.multiclick;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
public class MainActivity extends Activity implements OnClickListener {
private Button btClick = null;
private TextView tvCount = null;
private int count = 0;
private long firstTime = 0;
private Timer delayTimer;
private Handler handler;
private TimerTask task;
private long interval = 500;
@Override
protected void onCreate(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 = new Handler() {
@Override
public void handleMessage(Message msg) {
if (count == 1) {
tvCount.setText("单击事件");
} else if (count > 1) {
tvCount.setText("连续点击事件,共点击了 " + count + " 次");
}
delayTimer.cancel();
count = 0;
super.handleMessage(msg);
}
};
}
@Override
public void onClick(View v) {
long secondTime = System.currentTimeMillis();
// 判断每次点击的事件间隔是否符合连击的有效范围
// 不符合时,有可能是连击的开始,否则就仅仅是单击
if (secondTime - firstTime <= interval) {
++count;
} else {
count = 1;
}
// 延迟,用于判断用户的点击操作是否结束
delay();
firstTime = secondTime;
}
// 延迟时间是连击的时间间隔有效范围
private void delay() {
if (task != null)
task.cancel();
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
// message.what = 0;
handler.sendMessage(message);
}
};
delayTimer = new Timer();
delayTimer.schedule(task, interval);
}
}
布局文件<activity_main.xml>如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/btClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvCount"
android:layout_centerHorizontal="true"
android:layout_marginTop="62dp"
android:text="点击" />
<TextView
android:id="@+id/tvCount"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="34dp"
android:text="@string/hello_world" />
</RelativeLayout>
结果图如下:
本文是本人的学习笔记,如有什么不足之处,欢迎指出,谢谢!