『壹』 android中 使用AOP避免重復點擊事件
```javascript
```
``` javascript
//上次點擊的時間
private static Long sLastclick =0L;
//攔截所有兩次點擊時間間隔小於一秒的點擊事件
private static final Long FILTER_TIMEM =1000L;
//上次點擊事件View
private View lastView;
//---- add content -----
//是否過濾點擊 默兄掘昌認是
private boolean checkClick =true;
//---- add content -----
@Around("execution(* android.view.View.OnClickListener.onClick(..))")
public void onClickLitener(ProceedingJoinPoint proceedingJoinPoint)throws Throwable {
//大於指定時間
if (System.currentTimeMillis() -sLastclick >羨扒=FILTER_TIMEM) {
doClick(proceedingJoinPoint);
}else {
//---- update content ----- 判斷是否需要過濾點擊
//小於指定秒數 但是不是同一個view 可以點擊 或者不過濾點擊
if (!checkClick ||lastView ==null ||lastView != (proceedingJoinPoint).getArgs()[0]) {
//---- update content ----- 判斷是否需要過濾點擊
doClick(proceedingJoinPoint);
}else {
//大於指定秒數 且是同一個view
LogUtils.e(TAG,"重復點擊,已過濾");
}
}
}
//執行原有的 onClick 方法
private void doClick(ProceedingJoinPoint joinPoint)throws Throwable {
//判斷 view 是否存在
if (joinPoint.getArgs().length ==0) {
joinPoint.proceed();
return;
}
//記錄點擊的view
lastView = (View) (joinPoint).getArgs()[0];
//---- add content -----
//修改默認過濾點擊
checkClick =true;
//---- add content -----
//記錄點擊散粗事件
sLastclick =System.currentTimeMillis();
//執行點擊事件
try {
joinPoint.proceed();
}catch (Throwable throwable) {
throwable.printStackTrace();
}
}
@Before("execution(@包名.RepeatClick * *(..))")
public void beforeEnableDoubleClcik(JoinPoint joinPoint)throws Throwable {
checkClick =false;
}
```
『貳』 Android-View的事件分發及攔截-父控制項和子控制項都處理觸摸事件的方式
比如接著上篇 Android-View的事件分發及攔截機制簡單流程先體驗再研究(場景?疑問? 具體?待續...) ,小白現在要實現就是子View和父ViewGroup都響應點擊事件。
1. 單純的都只是響應down事件
這個就很簡單了 - 直接子View的**public boolean **onTouchEvent(MotionEvent event) 裡面直接返回false就行了。也就是子控制項響應了一次down後,接下來就交給父ViewGroup了.(子View就啥幾把也幹不了了);
2. 響應down和up事件,move啥的
我們知道子View如果onTouch裡面返回了true,那麼將會處理後續的move,up事件。而不再交給上層父ViewGroup。那父ViewGroup就沒辦法在Touch裡面處理,所以我們只能放到dispatchTouchEvent或者onInterceptTouchEvent中處理這個down,up等事件:
比如dispatchTouchEvent中:
這樣的情況就是父ViewGroup先執行點擊事件,然後子View再執行。 如果您螞掘罩需要父ViewGroup晚點,可以延時執行啥的。
如果此時,子View的dispatchTouchEvent返回true - 表示攔截,不繼續了
那麼子View的所有的事件都不會響應了。其實也就是散旁我悶鬧們的一個事件先傳遞,touch再處理的樹形圖:
網路上拔個圖來
簡單記錄下下而已,繼續加深理解...這是上一篇的續,還是上一篇....嘖嘖....後面是官方文檔分析來著...
『叄』 如何在Android應用里屏蔽滑鼠點擊事件
這個應該跟你的條碼槍有關吧 你試試 不讓edittext獲取焦點 或者 在觸屏事件加個攔截 我只是猜測!
『肆』 Android點擊事件和滑動沖突解決
對於一個根ViewGroup來說,發生點擊事件首先調用dispatchTouchEvent
如果這個ViewGroup的onIterceptTouchEvent返回true就表示它要攔截當前事件,接著這個ViewGroup的onTouchEvent就會被調用.如果onIterceptTouchEvent返回false,那麼就會繼續向下調用子View的dispatchTouchEvent方法,其實整體來說就是個責任鏈的模式,一層一層的進行分發,當某一層能處理的時候,事件消費結束,當任何一層都不處理的時候,事件返回到最上層。
當一個View需要處理事羨飢件的時候,如果它沒有設置onTouchListener,那麼直接調用onTouchEvent.如果設置了Listenter 那麼就要看Listener的onTouch方法返回值.為true就不調,為false就調onTouchEvent。onTouchListener中的onTouch方法每次都會先於view本身的onTouchEvent調用,且有優先消費權
View的默認實現會在onTouchEvent裡面把touch事件解析成Click之類的事件
點擊事件傳遞順序 Activity -> Window -> View
一旦一個元素攔截了某事件,那麼一個事件序列裡面後續的Move,Down事件都會交嫌清給它處理.並且它的onInterceptTouchEvent不會再調用
View的onTouchEvent默認都會消耗事件,除非它的clickable和longClickable都是false(不可點擊),但是enable屬性不會影響
外部調用一般是在外部的onInterceptTouchEvent的方法里,一般也是在move里判斷具體的滑動是否需要攔截,如果符合我們外部控制項的需求則返回true攔截,如果不符合則返回false不攔截,傳遞給子控制項。兩種方式其實原理都是一樣就是在move里去根據x和y的一個滑動距離來判斷具體將這次兄者返滑動事件交給誰去處理。