android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。
乙個最簡單的螢幕觸控動作觸發了一系列touch事件:action_down->action_move->action_move->action_move...->action_move->action_up
當螢幕中包含乙個viewgroup,而這個viewgroup又包含乙個子view,這個時候android系統如何處理touch事件呢?到底是viewgroup來處理touch事件,還是子view來處理touch事件呢?我只能很肯定的對你說不一定。呵呵,為什麼呢?看看下面我的調查結果你就明白了。
android系統中的每個view的子類都具有下面三個和touchevent處理密切相關的方法:
1)public boolean dispatchtouchevent(motionevent ev) 這個方法用來分發touchevent
2)public boolean onintercepttouchevent(motionevent ev) 這個方法用來攔截touchevent
3)public boolean ontouchevent(motionevent ev) 這個方法用來處理touchevent
當touchevent發生時,首先activity將touchevent傳遞給最頂層的view, touchevent最先到達最頂層 view 的 dispatchtouchevent ,然後由 dispatchtouchevent 方法進行分發,如果dispatchtouchevent返回true ,則交給這個view的ontouchevent處理,
如果dispatchtouchevent返回 false ,則交給這個 view 的 intercepttouchevent 方法來決定是否要攔截這個事件,如果 intercepttouchevent 返回 true ,也就是攔截掉了,則交給它的 ontouchevent 來處理,如果 intercepttouchevent 返回 false ,那麼就傳遞給子 view ,由子 view 的 dispatchtouchevent 再來開始這個事件的分發。如果事件傳遞到某一層的子 view 的 ontouchevent 上了,這個方法返回了 false ,那麼這個事件會從這個 view 往上傳遞,都是 ontouchevent 來接收。
而如果傳遞到最上面的 ontouchevent 也返回 false 的話,這個事件就會「消失」,而且接收不到下一次事件。
讓子先處理的方法是 從寫父的onintercepttouchevent事件並返回false
public boolean onintercepttouchevent(motionevent ev) 頂
1
踩
RecyclerView巢狀滑動衝突處理
在縱向recyclerview巢狀橫向recyclerview時,如果縱向recyclerview有下拉重新整理功能,那麼內部的橫向recyclerview的橫向滑動體驗會很差.只有純橫向滑動時,才能滑動內部的橫向recyclerview,否則滑動事件就會影響到下拉重新整理 新增攔截判斷.publi...
Android滑動衝突解決方法
dispatchtouchevent ev 偽 public boolean dispatchtouchevent motionevent ev else return consume 1.外部攔截法 重寫父view的oninterceptouchevent override public bool...
Android 滑動衝突的解決方式
外部解決滑動衝突的方式就是當我們viewgrop分發事件的時候判斷是否攔截,因為事件的分發機制就是從外向內分發,那麼我們在viewgrop分發的時候就判斷是否需要攔截就可以解決滑動衝突。內部解決滑動衝突的方式是首先讓父view不攔截事件,然後在子view中判斷是父view攔截呢還是子view攔截呢。...