一,如何为一个View设置多点击事件
此方法只能让该View响应一个多点击事件。
可使用情景:例如我们有需求让一个按钮只响应一个三击事件或者四击事件等
代码:
/**
* 用于处理多次点击事件,注意不能多个多次点击事件共存.例如,若您设置了三击事件,用户在指定时间内只有点击三下及以上才会响应事件,
* 低于三下不会响应任何事件。
*
*
*/
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);
}
二 ,如何让一个View可以同时响应多个多点击事件
可使用情景:例如我们有需求让一个按钮既可以响应单击事件也可以响应双击事件,甚至可以响应更高点击事件等
代码:
/**
* 用于处理多次点击事件,可以多个多次点击事件共存.例如,若您设置了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);
}
}