button 限制多点

2019-11-07  本文已影响0人  Anivia_Hanger

原文找不到了,之前项目一直用着的,这里记录一下

public class ButtonSlop {
    // 用来记录所有的按钮最后点击时间。
    private final static Map<String, Long> SLOPS_MAP = new HashMap<String, Long>();
    private static int MIN_SLOP = 500;

    /**
     * 默认500ms内不能再次点击。
     *
     * @param buttonId
     *            一般可以使用view.getId()用来区分不同的按钮。
     * @return true=表示当前不能点击,一般可以弹出提示,你点太快了,同时需要退出onClick。 false =
     *         表示可以再次触发点击了,一般放行,就可以进行处理了。
     */
    public static boolean check(int buttonId) {
        return check(buttonId, MIN_SLOP);
    }
    /**
     *
     * @param buttonId
     * @param holdTimeMills  传入最少需要等待的时间。如果不确定,可以调用上一个函数。默认最少500ms.
     * @return
     */
    public static boolean check(int buttonId, int holdTimeMills) {
        return check(String.valueOf(buttonId), holdTimeMills);
    }

    public static boolean waitInfinte(int buttonId) {
        return waitInfinte(String.valueOf(buttonId));
    }

    public static void cancel(int buttonId) {
        cancel(String.valueOf(buttonId));
    }

    public static boolean check(String buttonTag, int holdTimeMills) {
        if (buttonTag == null || buttonTag.length() <= 0)
            return true;// 合理的方式是确保参数不能为空,此处应该抛异常才合理。
        if (holdTimeMills < 100) {// 时间太短,没有意义。
            holdTimeMills = 100;
        }
        // 用同步块的方式控制防止多线程中操作失误。
        synchronized (SLOPS_MAP) {
            Long lastTipLong = SLOPS_MAP.get(buttonTag);
            if (lastTipLong == null
                    || System.currentTimeMillis() - lastTipLong >= holdTimeMills || System.currentTimeMillis() < lastTipLong) {
                SLOPS_MAP.put(buttonTag, System.currentTimeMillis());
                return false;// 表示第一次点击 或者 两次之间点击差够长了。
            } else {
                // 时间太短不允许再次触发。
                return true;
            }
        }
    }

    public static boolean waitInfinte(String buttonTag) {
        synchronized (SLOPS_MAP) {
            Long lastTipLong = SLOPS_MAP.put(buttonTag,
                    System.currentTimeMillis());
            return lastTipLong != null; // !=null说明已经存储过一次点击事件了,需要调用cancel后才能再次点击。
        }
    }

    public static void cancel(String buttonTag) {
        synchronized (SLOPS_MAP) {
            SLOPS_MAP.remove(buttonTag);
        }
    }
}

用法

 @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.left_button:
                if (ButtonSlop.check(R.id.left_button)) {
                    //连点无效 也可以用作双击button
                    return;
                }
              
                break;
        }
    }
上一篇下一篇

猜你喜欢

热点阅读