近期,在做公司的项目中,接到一个需求(app中首页下方的tab按钮选择时,单击切换tab,双击当前的tab页面内容滑动到顶部同时刷新数据)。总的来说,这个需求没有什么难度。
- 单击 -- 使用Android系统提供的OnClickListener接口即可实现
- 双击 -- Android系统中并未定义这类事件,所以需要我们自己定义。
好了,话不多说,记录一下双击事件的定义。
直接上代码。为双击点击事件命名为OnDoubleClickListener。让它实现View.OnTouchListener接口,重新onTouch方法。
//记录点击次数
private int count = 0;
//记录第一次点击时间
private long firstClick = 0;
//记录第二次点击时间
private long secondClick = 0;
//两次点击时间间隔,单位毫秒
private final int totalTime = 1000;
//自定义回调接口,用于进行双击事件的回调给调用者
private DoubleClickCallback mCallback;
public interface DoubleClickCallback {
void onDoubleClick();
}
public OnDoubleClickListener(DoubleClickCallback callback) {
super();
this.mCallback = callback;
}
/**
* 触摸事件处理
*/
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_DOWN == event.getAction()) {//按下
count++;
if (1 == count) {
firstClick = System.currentTimeMillis();//记录第一次点击时间
} else if (2 == count) {
secondClick = System.currentTimeMillis();//记录第二次点击时间
if (secondClick - firstClick < totalTime) {//判断二次点击时间间隔是否在设定的间隔时间之内
if (mCallback != null) {
mCallback.onDoubleClick();
}
count = 0;
firstClick = 0;
} else {
firstClick = secondClick;
count = 1;
}
secondClick = 0;
}
}
return true;
}
具体的实现思路就是记录两次MotionEvent.ACTION_DOWN事件触发的时间点,然后计算他们两个事件的时间差值,如果这个时间差值小于totalTime(自己定义的时间差参考值)则属于双击事件,否则为单击事件。
在需求中存在的问题: 因为tab的点击事件中,同时要有单击事件和双击事件。按照自定义双击事件的逻辑(当点击一下后,需要等到自己定义的时间差值后,才能确定本次事件是单机和双击),所以造成的缺陷问题就是,单击tab需要等一个时间差值后,事件的回调函数才会触发,页面才会切换。双击事件的回调无明显问题。
网友评论