Android 處理 View 重復(fù)點(diǎn)擊的多種方法
1、抽象類
//實(shí)現(xiàn) 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: 重復(fù)點(diǎn)擊"); } } 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、代理模式
//代理類實(shí)現(xiàn) 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; //構(gòu)造 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: 重復(fù)點(diǎn)擊"); } } }
//使用 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 //project dependencies { 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' } //module dependencies { //add implementation 'org.aspectj:aspectjrt:1.9.5' }
@Aspect public 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: 重復(fù)點(diǎn)擊"); } } }
代碼無侵入方式,直接生效了
以上就是Android 處理 View 重復(fù)點(diǎn)擊的多種方法的詳細(xì)內(nèi)容,更多關(guān)于Android 處理 View 重復(fù)點(diǎn)擊的資料請關(guān)注腳本之家其它相關(guān)文章!
- Android開發(fā)教程之如何屏蔽View的重復(fù)點(diǎn)擊
- Android中如何優(yōu)雅的處理重復(fù)點(diǎn)擊實(shí)例代碼
- Android中AOP的應(yīng)用實(shí)踐之過濾重復(fù)點(diǎn)擊
- Android優(yōu)雅地處理按鈕重復(fù)點(diǎn)擊的幾種方法
- Android防止按鈕重復(fù)點(diǎn)擊示例代碼
- Android 防止多次重復(fù)點(diǎn)擊的三種方法的示例
- Android 快速實(shí)現(xiàn)防止網(wǎng)絡(luò)重復(fù)請求&按鈕重復(fù)點(diǎn)擊的方法
- Android之有效防止按鈕多次重復(fù)點(diǎn)擊的方法(必看篇)
- 實(shí)例詳解Android解決按鈕重復(fù)點(diǎn)擊問題
- Android如何優(yōu)雅的處理重復(fù)點(diǎn)擊
相關(guān)文章
手把手教你實(shí)現(xiàn)Android編譯期注解
今天給大家介紹Android編譯期注解sdk的步驟以及注意事項(xiàng),并簡要分析了運(yùn)行時(shí)注解以及字節(jié)碼技術(shù)在生成代碼上與編譯期注解的不同與優(yōu)劣,感興趣的朋友一起看看吧2021-07-07Android 客戶端RSA加密的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 客戶端RSA加密的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能掌握RSA 的使用,需要的朋友可以參考下2017-08-08Android輪播圖點(diǎn)擊圖片放大效果的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android輪播圖點(diǎn)擊圖片放大效果的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Android編程實(shí)現(xiàn)手機(jī)震動功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)手機(jī)震動功能的方法,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)手機(jī)震動功能的核心代碼與權(quán)限控制操作技巧,需要的朋友可以參考下2017-06-06android獲取手機(jī)IMSI碼判斷手機(jī)運(yùn)營商代碼實(shí)例
這篇文章主要介紹了android獲取手機(jī)IMSI碼判斷手機(jī)運(yùn)營商代碼實(shí)例,大家參考使用2013-11-11Android 消息機(jī)制以及handler的內(nèi)存泄露
這篇文章主要介紹了Android 消息機(jī)制以及handler的內(nèi)存泄露的相關(guān)資料,需要的朋友可以參考下2016-09-09Android開發(fā)SavedState?Jetpack狀態(tài)保存利器
這篇文章主要為大家介紹了Android開發(fā)SavedState?Jetpack狀態(tài)保存利器使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08