Android 处理 View 重复点击的多种方法

时间:2021-05-21

1、抽象类

//实现 View.OnClickListener 接口public abstract class OnThrottleClickListener implements View.OnClickListener { private static final String TAG = "OnThrottleClickListener"; private static final int SKIP_DURATION = 300;//milliseconds private long mLastClickTime; @Override public void onClick(View v) { if (System.currentTimeMillis() - mLastClickTime > SKIP_DURATION) { onThrottleClick(v); mLastClickTime = System.currentTimeMillis(); } else { Log.e(TAG, "OnThrottleClickListener: 重复点击"); } } protected abstract void onThrottleClick(View v);}//代替 new View.OnClickListener() 使用id_tv_1.setOnClickListener(new OnThrottleClickListener() { @Override protected void onThrottleClick(View v) { Log.e(TAG, "onClick: OnThrottleClickListener "); }});

2、代理模式

//代理类实现 View.OnClickListener 接口public class ThrottleClickProxy implements View.OnClickListener { private static final String TAG = "ThrottleClickProxy"; private static final int SKIP_DURATION = 300;//milliseconds private long mLastClickTime; //源对象 private View.OnClickListener mOriginListener; //构造 public ThrottleClickProxy(View.OnClickListener mOriginListener) { this.mOriginListener = mOriginListener; } @Override public void onClick(View v) { if (System.currentTimeMillis() - mLastClickTime >= SKIP_DURATION) { mOriginListener.onClick(v); mLastClickTime = System.currentTimeMillis(); } else { Log.e(TAG, "ThrottleClickProxy: 重复点击"); } }}//使用 id_tv_2.setOnClickListener(new ThrottleClickProxy(new View.OnClickListener() { @Override public void onClick(View v) { Log.e(TAG, "onClick: ThrottleClickProxy "); } }));

3、RxAndroid 之 RxBinding

implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha1' RxView.clicks(id_tv_3) .throttleFirst(300, TimeUnit.MILLISECONDS) .subscribe(new Consumer<Unit>() { @Override public void accept(Unit unit) throws Exception { Log.e(TAG, "onClick: throttleFirst "); } });

4、AOP 之 Eclipse AspectJ

//采用 AspectJX 来快速配置 Eclipse AspectJ//projectdependencies { classpath "com.android.tools.build:gradle:4.1.2" //add classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'}plugins { id 'com.android.application' //add id 'android-aspectjx'}//moduledependencies { //add implementation 'org.aspectj:aspectjrt:1.9.5'}@Aspectpublic class ThrottleClickAspect { private static final String TAG = "ThrottleClickAspect"; private static final int SKIP_DURATION = 3000; private long mLastClickTime; //所有的 android.view.View.OnClickListener.onClick 方法都会被织入,像第三方组件 RxView.clicks() 里也会 @Around("execution(* android.view.View.OnClickListener.onClick(..))") public void aroundViewOnClick(ProceedingJoinPoint joinPoint) throws Throwable { if (System.currentTimeMillis() - mLastClickTime >= SKIP_DURATION) { joinPoint.proceed(); mLastClickTime = System.currentTimeMillis(); } else { Log.e(TAG, "ThrottleClickAspect: 重复点击"); } }}

代码无侵入方式,直接生效了

以上就是Android 处理 View 重复点击的多种方法的详细内容,更多关于Android 处理 View 重复点击的资料请关注其它相关文章!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章