/**
-
防抖动点击
-
@author jiangshicheng
*/
public class AntiShakeUtils {private final static long INTERNAL_TIME = 1000;
/**
- Whether this click event is invalid.
- @param target target view
- @return true, invalid click event.
- @see #isInvalidClick(View, long)
*/
public static boolean isInvalidClick(@NonNull View target) {
return isInvalidClick(target, INTERNAL_TIME);
}
/**
- Whether this click event is invalid.
- @param target target view
- @param internalTime the internal time. The unit is millisecond.
- @return true, invalid click event.
*/
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;
}
}
资源目录values下新建资源文件:
ids.xml:
实现原理:给Button设置名为last_click_time的tag标签并存储上一次点击的时间戳,在一定的时间间隔内只取第一次点击事件。如此, Button会随着界面的销毁而被释放,因而它的名为last_click_time的tag标签存储所占用的内存也会被释放回收。
使用起来那就是更简单了
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (AntiShakeUtils.isInvalidClick(v))
return;
// TODO: 2018/7/1
}
});
你还可以自定义有效点击的时间间隔:
if (AntiShakeUtils.isInvalidClick(v, 800))
return;
用过之后,从此不罢手!