Android 最省代码的双击判断
来源:互联网 发布:局域网共享打印软件 编辑:程序博客网 时间:2024/05/16 05:48
前言:我们在做项目的时候,经常会碰到这种情况:一个控件的点击事件,当点击速度过快的时候——一般是双击,点击事件会响应两次,而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中写一遍;
转载请保留原文地址;
阅读全文