android雙向滑動衝突處理及解決方案

2021-07-10 10:55:30 字數 1346 閱讀 1844

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攔截呢。...