Android 處理 View 重復(fù)點(diǎn)擊的多種方法
//實(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//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: 重復(fù)點(diǎn)擊'); } }}
代碼無侵入方式,直接生效了
以上就是Android 處理 View 重復(fù)點(diǎn)擊的多種方法的詳細(xì)內(nèi)容,更多關(guān)于Android 處理 View 重復(fù)點(diǎn)擊的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. CSS hack用法案例詳解2. ASP.NET Core實(shí)現(xiàn)中間件的幾種方式3. 使用HttpClient增刪改查ASP.NET Web API服務(wù)4. JSP servlet實(shí)現(xiàn)文件上傳下載和刪除5. 詳解瀏覽器的緩存機(jī)制6. 怎樣才能用js生成xmldom對象,并且在firefox中也實(shí)現(xiàn)xml數(shù)據(jù)島?7. input submit、button和回車鍵提交數(shù)據(jù)詳解8. 怎樣打開XML文件?xml文件如何打開?9. 詳解盒子端CSS動畫性能提升10. css代碼優(yōu)化的12個技巧
