自定義一個(gè)NoDoubleClickListener類,實(shí)現(xiàn)OnClickListener接口:
public abstract ?class ?NoDoubleClickListener ?implements View.OnClickListener{privatestaticlonglastClickTime =0;publicstaticfinalintMIN_CLICK_DELAY_TIME =700;publicabstractvoidonNoDoubleClick(View view);@OverridepublicvoidonClick(View v) {longcurrentTime = Calendar.getInstance().getTimeInMillis();if(currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {? ? ? ? ? ? lastClickTime = currentTime;? ? ? ? ? ? onNoDoubleClick(v);? ? ? ? }? ? }}
使用NoDoubleClickListener代替OnClickListener來實(shí)現(xiàn)點(diǎn)擊事件:
mbutton.setOnClickListener(newNoDoubleClickListener() {@OverrideprotectedvoidonNoDoubleClick(View v) {? ? ? ? ? ? doSomeThing();? ? ? ? }? ? });}
1. 在View的setOnClickListener中可以看到OnClickListener的對象賦值給了getListenerInfo().mOnClickListener
publicvoidsetOnClickListener(@Nullable OnClickListener l) {if(!isClickable()) {? ? ? ? setClickable(true);? ? }? ? getListenerInfo().mOnClickListener = l;}
2. 在View類的performClick()中會調(diào)用mOnClickListener.onClick()方法
publicbooleanperformClick() {finalbooleanresult;finalListenerInfo li = mListenerInfo;if(li !=null&& li.mOnClickListener !=null) {? ? ? ? playSoundEffect(SoundEffectConstants.CLICK);? ? ? ? li.mOnClickListener.onClick(this);? ? ? ? result =true;? ? }else{? ? ? ? result =false;? ? }? ? sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);returnresult;}
3. 調(diào)用View的onClick()后,就會回調(diào)NoDoubleClickListener中的onClick()方法,經(jīng)過按鍵防抖處理后再回調(diào)onNoDoubleClick()方法