ViewPager子View滑動事件衝突解決

事件分發:public boolean dispatchTouchEvent(MotionEvent ev)

Android事件以隧道方式逐層向下傳遞。事件首先由dispatchTouchEvent方法分發,分發邏輯如下:

return true;由該dispatchTouchEvent方法消費並且停止分發。

return false;返回給父view的onTouch方法處理

return super.dispatchTouchEvent(ev);有當前view的onInterceptTouchEvent()攔截處理。

事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)

當前view攔截到事件後,處理流程如下:

return false;表示放行由當前view的子view的dispatchTouchEvent分發處理。

return true或return super.onInterceptTouchEvent()表示攔截該事件,由該View的Ontouch方法處理。

事件響應:public boolean onTouchEvent(MotionEvent ev)

return true表示消費。

return false或return super.onTouch()則此事件傳遞給上層View的onTouch方法處理。

此上是筆者關於Android事件分發的一些小總結。

回到上面的問題,ViewPager中子View的滑動衝突問題,筆者這裏遇到的問題是ViewPager的View中嵌套一個廣告條,廣告條是需要左右滑動的,這樣廣告條的滑動事件和ViewPager很明顯會纏上衝突。筆者這裏用到的方法是,在廣告條組件中添加此方法。
?
1
2
3
4
5

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}

這裏dispatchTouchEvent方法對事件進行分發,根據上面的總結很明顯是分發當前的onInterceptTouchEvent(),然後分發給當前view的onTouchEvent由此處理滑動事件。同時
?
1

getParent().requestDisallowInterceptTouchEvent(true);

這句話告訴父控件此事件你就不要攔截了,由我子view自己進行處理即可。這樣即可解決此衝突問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章