前言:我们在做项目的时候,经常会碰到这种情况:一个控件的点击事件,当点击速度过快的时候——一般是双击,点击事件会响应两次,而Android系统中没有双击这个判断,这个时候就需要我们自己来写一个,于是在网上看了一下。思路一般是保存按钮的点击时间,判断时间差,以此用来判断是否是双击,而在做项目的时候,发现有个不方便的地方,每次点击事件中都需要写一次,于是,为了简化代码,我在此基础上做了些许改动,能够简化些许代码,废话少说,看代码:
import android.app.Activity;
import android.util.SparseArray;
import android.view.View;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.Flowable;
import io.reactivex.schedulers.Schedulers;
/**
* 点击事件的工具类
*/
public class ClickUtil {
//activity中的view的集合
private static Map<Activity, SparseArray<Long>> viewIdMap = new HashMap<>();
public static boolean isDoubleClick(Activity activity, View view) {
return isDoubleClick(activity, 1000, view);
}
//遍历当前activity内的view对应的点击时间
public static boolean isDoubleClick(Activity activity, long time, View view) {
//判断当前activity是否有对应的数据
if (!viewIdMap.containsKey(activity)) {
SparseArray<Long> viewIdArray = new SparseArray<>();
viewIdArray.put(view.getId(), System.currentTimeMillis());
viewIdMap.put(activity, viewIdArray);
return false;
}
//view对应的点击时间数据
SparseArray<Long> viewIdArray = viewIdMap.get(activity);
//rxJava循环
return Flowable.just(viewIdArray).subscribeOn(Schedulers.newThread()) //子线程内
//遍历输出view的id:转换为string格式,long格式在null值的情况下会报错
.map(longSparseArray -> String.valueOf(viewIdArray.get(view.getId())))
.to(longObservable -> { //view的id
String viewTime = longObservable.blockingFirst(); //获取view对应的点击时间
if (viewTime.equals("null")) { //转换为string格式,默认为 "null" 值
viewIdArray.put(view.getId(), System.currentTimeMillis());
return false;
} else {
long lastClickTime = System.currentTimeMillis();
if (lastClickTime - Long.parseLong(viewTime) < time) {
viewIdArray.put(view.getId(), lastClickTime);
return true;
}
viewIdArray.put(view.getId(), lastClickTime);
return false;
}
});
}
//移除view的数据
public static void removeClickView(Activity activity) {
if (viewIdMap.containsKey(activity)) {
viewIdMap.remove(activity);
}
}
}
双击判断与网络的大部分一样,通过判断点击事件差来判断是否是双击,而在其中做的改良是,保存所有按钮的点击时间,简化代码;
用法:
public void onClick(View view) {
//判断是否是双击:是双击则直接退出
if (ClickUtil.isDoubleClick(this, view)) {
return;
}
switch (view.getId()) {
case R.id.one:
break;
case R.id.two:
break;
case R.id.three:
break;
case R.id.four:
break;
case R.id.five:
break;
}
}
这样写就简单多了,至少不用在每个点击事件当中都写一次,当然,这个只是写了onclick里面的判断;
最后,别忘了清除数据:
@Override
protected void onDestroy() {
super.onDestroy();
//移除当前activity的点击
ClickUtil.removeClickView(this);
}
这段代码可以写一个BaseActivity用来统一父类方法,就不用在每个activity中写一遍;转载请保留原文地址;