在做多媒体项目的时候,有这么个需求:需要对视频播放控制按钮做防快速点击,实现方式有多种,最终选择了如下的一种实现方式,在生产环境中也经起了检验。做成一个工具类,方便在需要的时候直接调用。
这是一种比较原始的方式,通过实现原生的view的OnClickListener,来自定义一个防快速点击的ClickListener,这样可以使用View.OnClickListener的地方都可以使用这个自定义ClickListener。
实际上RxJava通过操作符也可以高效便捷的实现,尤其是当项目中已经依赖过RxJava库的时候,直接用RxJava的实现方案更好一些。
不扯那么远了,直接贴出这种自定义OnClickListener的比较原生的实现方案:
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import java.util.Calendar;
/**
* 防止连续点击事件,里面根据需求设置间隔时间
*/
public abstract class NoDoubleClickListener implements OnClickListener {
privatestatic final String TAG = "NoDoubleClickListener";
/**
* 防止连续点击设置的毫秒值
*/private int MIN_CLICK_DELAY_TIME ;private long lastClickTime = 0;
/**
* 设置毫秒值的 点击事件 构造函数
* @param time 多少秒延迟的毫秒值
*/
public NoDoubleClickListener(int time){MIN_CLICK_DELAY_TIME = time;
}
@Override
public void onClick(View v) {
long currentTime = Calendar.getInstance().getTimeInMillis();
Log.i(TAG, "防止连点快进--- currentTime===" + currentTime+"---lastClickTime==="+lastClickTime);
if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
Log.i( TAG, "防止连点快进判断结果:" + (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME));
lastClickTime = currentTime;
onNoDoubleClick(v);
} else{
Log.i( TAG, "防止连点快进判断结果:" + (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME));
lastClickTime = currentTime;
}
}
/*** 防止连续点击事件* @param*/public abstract void onNoDoubleClick(View v){
}