1.理解原理:
1 | public class FastClickUtil { |
是的,原理很简洁:
- 通过记录和保存下每次点击时刻的时间戳
- 将本次时间戳减去上一次时间戳,小于间隔时间INTERVAL_TIME,则是fastClick
2.使用原理:
对原理的直接的使用的如下:
1 | mButton.setOnClickListener((view) -> { |
这个时候懒惰的程序猿们肯定在想了,我是不是疯了😱,要在每一个点击操作前面加入这么一个判断。
3.简易封装
由 步骤2 的使用原理,很容易想到将这个isFastClick()的判断封装到接口中去:
1 | public abstract class OnIntervalClickListener implements View.OnClickListener { |
这里的OnIntervalClickListener就已经过滤了fastClick的事件,使用方式就变为了:
1 | mButton.setOnClickListener(new OnIntervalClickListener() { |
是不是觉得这个世界,还是充满着美好的😇。
同理重写 AdapterView.OnItemClickListener 就可以避免 ListView 重复点击的问题。
4.扩展方式
响应式编程:
Debounce
函数过滤掉由Observable发射的速率过快的数据;如果在一个指定的时间间隔过去了仍旧没有发射一个,那么它将发射最后的那个。
1 | RxView.clicks(mButton).debounce(800, TimeUnit.MILLISECONDS).subscribe(new Action1<Object>() { |
因此以上代码要响应事件的话,必须是 800ms后,无点击才会进入。不适合做页面跳转等,立即性的响应。
ThrottleFirst
发射在那段时间内的第一项数据。
1 | RxView.clicks(mButton).throttleFirst(800, TimeUnit.MILLISECONDS) |
以上代码就是响应800ms内的第一个点击事件。过滤这个时间段内的其他事件。
sample(别名throttleLast)
发射自上次采样以来它最近发射的数据。与ThrottleFirst采样的方式相反。
1 | RxView.clicks(mButton).sample(800, TimeUnit.MILLISECONDS) |
这里的sample相对应ThrottleFirst,达到与上面debounce,一同的效果。