在用户使用 应用的时候,经常会出现点击过快且多次点击同一控件的情况,
一方面这是因为应用或手机当前有些卡顿,网络卡啥的
另一方面也可能是由于很多应用并没有设置按钮点击时的 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/