此方法只能让该View响应一个多点击事件。java
可以使用情景:例如咱们有需求让一个按钮只响应一个三击事件或者四击事件等ide
代码:this
/** * 用于处理屡次点击事件,注意不能多个屡次点击事件共存.例如,若您设置了三击事件,用户在指定时间内只有点击三下及以上才会响应事件, * 低于三下不会响应任何事件。 * * */ public abstract class OnMultiClickLisener implements View.OnClickListener { // 记录用户点击控件时的时间 private long[] hit = null; // 完成这几回点击所需的时间 private long interval; /** * 默认{@link #interval}为500ms * * @param hit * 表示此事件是几击事件 */ public OnMultiClickLisener(int hit) { this(hit, 500L); } /** * * @param hit * 表示此事件是几击事件 * @param interval * 指定时间(ms),用户完成hit次点击所费时间在此时间间隔内则视为完成了屡次点击事件 */ public OnMultiClickLisener(int hit, long interval) { super(); this.hit = new long[hit]; this.interval = interval; } @Override public void onClick(View v) { System.arraycopy(this.hit, 1, this.hit, 0, this.hit.length - 1); this.hit[this.hit.length - 1] = SystemClock.uptimeMillis(); if (this.hit[this.hit.length - 1] - this.hit[0] < this.interval) { // 完成点击事件时间间隔小于指定时间则多击事件完成 this.onMultiClick(v); } } /** * 用户完成多击事件时调用的方法 * * @param view * 用户点击的View */ public abstract void onMultiClick(View view); }
可以使用情景:例如咱们有需求让一个按钮既能够响应单击事件也能够响应双击事件,甚至能够响应更高点击事件等spa
代码:code
/** * 用于处理屡次点击事件,能够多个屡次点击事件共存.例如,若您设置了View最多能够处理四击事件,用户在指定时间内点击了三下,则会依次处理三击, * 双击,单击事件,除非某一个事件方法返回了true,那么就不会再执行接下来的事件方法了,若用户点击了五下或者更多,那也只会处理四击,三击,双击, * 单击事件。 * */ public class OnAnyMultiClickLisener implements View.OnClickListener { // 记录用户点击控件的次数 private int hit = 0; // 表示最多可响应几击事件 private int count = 0; // 完成整个点击事件所需的时间 private long interval; // 定义一个Timer用于执行定时任务 private Timer timer; // 响应事件的处理器 private OnAnyMultiClickLisener.OnMultiClickEvent[] liseners = null; /** * 默认{@link #interval}为500ms * * @param liseners * 处理事件的处理器,传入n个表明能够处理在interval时间内从1到n次点击的事件. * 例如:若传入了三个处理器,则表示在interval时间内,能够处理用户的单击事件,双击事件和三击事件. * 事件类型的处理分别对应于下标0,1,2 */ public OnAnyMultiClickLisener( OnAnyMultiClickLisener.OnMultiClickEvent... liseners) { this(500L, liseners); } /** * * @param interval * 完成整个点击事件的时间(ms) * @param liseners * 处理事件的处理器,传入n个表明能够处理在interval时间内从1到n次点击的事件. * 例如:若传入了三个处理器,则表示在interval时间内,能够处理用户的单击事件,双击事件和三击事件. * 事件类型的处理分别对应于下标0,1,2 */ public OnAnyMultiClickLisener(long interval, OnAnyMultiClickLisener.OnMultiClickEvent... liseners) { super(); this.interval = interval; this.liseners = liseners; this.count = liseners.length; this.timer = new Timer(); } @Override public void onClick(View v) { if (this.hit < this.count) { // 用户点击次数加1 this.hit++; } if (1L == this.hit) { final View vv = v; // 定义一个定时任务 final TimerTask task = new TimerTask() { @Override public void run() { // 根据在this.interval时间段内点击的次数执行相应的点击事件,处理顺序由高次点击事件到低次点击事件 for (int i = hit; i > 0; i--) { if (liseners[i - 1].OnMultiClick(vv)) { // 若用户想要此事件独占,而再也不向低次事件传播下去则跳出循环 break; } } // 完成整个事件处理以后,hit清零 hit = 0; // 取消这个task this.cancel(); } }; // 开启一个定时任务 this.timer.schedule(task, this.interval); } } /** * 用于{@link OnAnyMultiClickLisener}多事件处理的处理器 * * */ public interface OnMultiClickEvent { /** * 处理用户点击事件的方法 * * @param view * 用户点击的View * @return 是否独占事件的响应。如果返回true,不然返回false.例如:若值为false,用户传入了三个事件处理器, * 在指定时间内完成了三击,那么会优先处理三击事件,而后处理双击事件,最后处理单击事件, * 固然若在处理双击事件时此方法返回了true,那么事件将不会传播下去,也就是说不会处理单击事件。 */ public boolean OnMultiClick(View view); } }