一直以来,我进行防止按钮重复点击的操作都很原始。就用一个变量判断,操作完成后再可以进行下一次的操作。今天看了几篇“最佳方案”,还挺有意思的,在此记录。
比如:findClickView代替findViewById正常进行操作就可以防抖动等。
因为项目中使用了ButterKnife绑定控件和为控件注册点击事件,所以使用了以下方式:
1.防抖动工具类
/**
* 防抖动点击
* @author zachary
*/
public class AntiShakeUtils {
private final static long INTERNAL_TIME = 1000;
public static boolean isInvalidClick(@NonNull View target) {
return isInvalidClick(target, INTERNAL_TIME);
}
public static boolean isInvalidClick(@NonNull View target, @IntRange(from = 0) long internalTime) {
long curTimeStamp = System.currentTimeMillis();
long lastClickTimeStamp = 0;
Object time = target.getTag(R.id.last_click_time);
if (time == null){
target.setTag(R.id.last_click_time, curTimeStamp);
return false;
}
lastClickTimeStamp = (Long) time;
boolean isInvalid = curTimeStamp - lastClickTimeStamp < internalTime;
if (!isInvalid)
target.setTag(R.id.last_click_time, curTimeStamp);
return isInvalid;
}
}
2.资源目录values下新建文件:ids.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="last_click_time" type="id"/>
</resources>
给控件设置的tag标签并存储上一次点击的时间戳,在时间间隔内只取第一次点击事件。控件被释放,它的tag标签存储所占用的内存也会被释放回收。
页面中点击时使用方法:
public void onClick(View v) {
if (AntiShakeUtils.isInvalidClick(v))
return;
}
}
缺点:不能针对多个按钮,分别进行防抖动操作。