事件分發:public boolean dispatchTouchEvent(MotionEvent ev)java
Android事件以隧道方式逐層向下傳遞。事件首先由dispatchTouchEvent方法分發,分發邏輯以下:ide
return true;由該dispatchTouchEvent方法消費而且中止分發。
spa
return false;返回給父view的onTouch方法處理
code
return super.dispatchTouchEvent(ev);有當前view的onInterceptTouchEvent()攔截處理。事件
事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)get
當前view攔截到事件後,處理流程以下:io
return false;表示放行由當前view的子view的dispatchTouchEvent分發處理。
class
return true或return super.onInterceptTouchEvent()表示攔截該事件,由該View的Ontouch方法處理。
request
事件響應:public boolean onTouchEvent(MotionEvent ev)方法
return true表示消費。
return false或return super.onTouch()則此事件傳遞給上層View的onTouch方法處理。
此上是筆者關於Android事件分發的一些小總結。
回到上面的問題,ViewPager中子View的滑動衝突問題,筆者這裏遇到的問題是ViewPager的View中嵌套一個廣告條,廣告條是須要左右滑動的,這樣廣告條的滑動事件和ViewPager很明顯會纏上衝突。筆者這裏用到的方法是,在廣告條組件中添加此方法。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); }
這裏dispatchTouchEvent方法對事件進行分發,根據上面的總結很明顯是分發當前的onInterceptTouchEvent(),而後分發給當前view的onTouchEvent由此處理滑動事件。同時
getParent().requestDisallowInterceptTouchEvent(true);
這句話告訴父控件此事件你就不要攔截了,由我子view本身進行處理便可。這樣便可解決此衝突問題。