在用户使用 应用的时候,经常会出现点击过快且多次点击同一控件的情况,
一方面这是因为应用或手机当前有些卡顿,网络卡啥的
另一方面也可能是由于很多应用并没有设置按钮点击时的 selector 或者其它按钮响应方式(例如点击按钮时按钮放大,常见于游戏),导致用户误认为没有点击到当前按钮。(比如使用selector再点击后更换背景颜色,图片等等)
一.防止按钮多次点击
1.工具类:一般按钮的防止多次点击我使用的是自己封装的工具类;
public class AntiShakeUtils {
private final static long INTERNAL_TIME = 2000;
/**
* 此点击事件是否无效。
*
* @param target 目标视图
* @return true, 无效点击事件。
* @see #isInvalidClick(View, long)
*/
public static boolean isInvalidClick(@NonNull View target) {
return isInvalidClick(target, INTERNAL_TIME);
}
/**
* 此点击事件是否无效。
*
* @param target 目标视图
* @param internalTime 内部时间。单位是毫秒。
* @return true, 无效点击事件。
*/
public static boolean isInvalidClick(@NonNull View target, @IntRange(from = 0) long internalTime) {
long curTimeStamp = System.currentTimeMillis();
long lastClickTimeStamp = 0;
Object o = target.getTag(R.id.last_click_time);
if (o == null) {
target.setTag(R.id.last_click_time, curTimeStamp);
return false;
}
lastClickTimeStamp = (Long) o;
boolean isInvalid = curTimeStamp - lastClickTimeStamp < internalTime;
if (!isInvalid)
target.setTag(R.id.last_click_time, curTimeStamp);
return isInvalid;
}
}
如何调用:在用户使用提现功能时,为防止跳转多个页面,使用此方法,v代表着控件ID
2.常用工具类(这个是简化版的)
public class FastClickUtil {
private static final int MIN_DELAY_TIME = 300; // 两次点击间隔不能少于300ms
private static long lastClickTime;
/**
* 判断是否多次点击
* @return 是否快速点击
*/
public static boolean isFastClick() {
boolean flag = true;
long currentClickTime = System.currentTimeMillis();
if ((currentClickTime - lastClickTime) >= MIN_DELAY_TIME) {
flag = false;
}
lastClickTime = currentClickTime;
return flag;
}
}
二、防止列表子项多个点击(多点触控)
在使用文章阅读功能时,由于是跳转html页面,在跳转过程的很短的过程中,可以点击其他子项,或者同时点击多个子项,会造成跳转了多篇文章,并且返回时,一个一个的返回,在使用一方法时,发现方法无效,于是使用了以下方法:
给控件加上 android:splitMotionEvents="false" 属性 完美解决
参考文献:https://www.freesion.com/article/464369753/