Android中View的事件分發和攔截機制

2021-08-09 02:44:59 字數 2198 閱讀 7897

1.關係到事件分發和攔截機制的三個方法

1.dispatchtouchevent(motionevent event)方法

2.onintercepttouchevent(motionevent event)方法

3.ontouchevent(motionevent event)方法

2.dispatchtouchevent(motionevent event)分發事件

*該方法主要是用來事件分發的,返回值有三種情況

1.返回 super.dispatchtouchevent(ev)

會將事件分發下去

2.返回true

不會將事件分發下去,自己就呼叫當前view的ontouchevent方法處理了

3.返回false

不會將事件分發下去

*該方法內部其實自己呼叫了onintercepttouchevent方法,進行事件攔截,預設情況下不會攔截事件,將事件放行。

*子view可以申請父view進行攔截/不攔截,其實也就是在內部判斷是否呼叫onintercepttouchevent進行事件攔截。

1.getparent().requestdisallowintercept(true)

申請父view不攔截,那就執行自己的ontouchevent事件

2.getparent().requestdisallowintercept(false)

申請攔截,父view將其事搶奪過來,執行父view的ontouchevent事件

3.onintercepttouchevent(motionevent event)攔截事件

三種返回值:

1.true

將事件攔截,不在分發下去,執行當前view的ontouchevent

2.false

將事件方法(預設就是放行),那子view會繼續分發事件執行dispatchtouchevent。

3. super.onintercepttouchevent(ev)

預設情況下不攔截

4.ontouchevent(motionevent event)

是用來處理事件的,接收到分發的事件,就呼叫該方法去進行事件的處理

返回true,就不將事件回傳給父view,自己消費掉

返回false和super.ontouchevent(ev),將事件回傳給父view,並由父view的的ontouchevent來接收

5.demo(案例)

1.兩個viewpager巢狀關係出現的問題。

當兩個viewpager巢狀的時候,(viewpager自帶滑動功能)在滑動內層(子)viewpager的時候,在沒有做處理的情況下,外層(父)的viewpager會搶奪滑動事件,所以會出現,滑動子viewpager的時候,父viewpager滑動了,這種使用者體驗就很差

2.解決辦法

1)自定義乙個類繼承viewpager,作為內層的viewpafder

2)複寫ondispatchevent(mptionevent event)方法,

3)定義條件,在滿足什麼樣條件下申請父view不攔截或者攔截

比如:在子viewpager滑動到第乙個頁面並且從左往右滑動的時候,申請父view攔截,getparent().requestdisallowinterceptevent(false),而子viewpager預設到了第乙個頁面的時候,再繼續向前乙個不存在的頁面是不能滑動的,這個時候父viewpager就進行滑動,滑到子viewpager最後乙個頁面並且繼續從右往左滑動,同樣的申請父view攔截。在其他情況下申請父view不攔截getparent().requestdisallowinterceptevent(true),那麼父viewpager將不會個子viewpager搶奪滑動事件,子viewpager可以順暢的滑動。

3.code(**)

@override

public boolean dispatchtouchevent(motionevent ev) else if (getcurrentitem() < getchildcount() - 1 && dx > 0) else

}else

break;

}//依然還是走父view中去分發事件

return super.dispatchtouchevent(ev);

}

Android中View的事件分發和攔截機制

部落格轉移到個人站點 歡迎來吐槽 1.關係到事件分發和攔截機制的三個方法 1.dispatchtouchevent motionevent event 方法 2.onintercepttouchevent motionevent event 方法 3.ontouchevent motionevent...

Android之View的事件體系

velocitytracker,gesturedetector,scroller 1.velocitytracker 速度追蹤 在ontouch中新增 override public boolean ontouch view v,motionevent event 不過回頭一看,發現書中是放在ont...

Android開發藝術筆記 View的事件體系

根據上圖,可以得出view的寬高和座標的關係 width right left height bottom top 關於如何得到view的這四個引數,在view的原始碼中它們對應於mleft mright mtop和mbottom這四個成員變數,獲取方式 概念 速度追蹤,用於追蹤手指在滑動過程中的速...