1. 程式人生 > >用requestDisallowInterceptTouchEvent()方法防止viewpager和子view衝突

用requestDisallowInterceptTouchEvent()方法防止viewpager和子view衝突

ViewPager來實現左右滑動切換tab,如果tab的某一項中嵌入了水平可滑動的View就會讓你有些不爽,比如想滑動tab項中的可水平滑動的控制元件,卻導致tab切換。

因為Android事件機制是從父View傳向子View的,可以去檢測你當前子View是不是在有可滑動控制元件等,決定事件是否攔截,但是這個比較麻煩,而且並不能解決所有的問題(必須檢測觸控點是否在這個控制元件上面),其實有比較簡單的方法,在你巢狀的控制元件中注入ViewPager例項(呼叫控制元件的getParent()方法),然後在onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent裡面告訴父View,也就是ViewPager不要攔截該控制元件上的觸控事件。

1 requestDisallowInterceptTouchEvent(true)

程式碼一般如下:

1 2 3 4 5 6 7 8 9 10 11 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: pager.requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: pager.requestDisallowInterceptTouchEvent(false); break; } }

當用戶按下的時候,我們告訴父元件,不要攔截我的事件(這個時候子元件是可以正常響應事件的),拿起之後就會告訴父元件可以阻止。

ScrollView的原始碼中有比較詳細的程式碼,那個對觸控滑動的處理更精確一些,垂直滑動的時候,基本可以做到不會和viewpager衝突。

ViewGroup.onInterceptTouchEvent(MotionEvent) - 這允許一個檢視組ViewGroup 在分發給子檢視時觀察這些事件。ViewParent.requestDisallowInterceptTouchEvent(boolean)

 - 在一個父檢視之上呼叫這個方法來表示它不應該通過onInterceptTouchEvent(MotionEvent)來捕獲觸控事件。