首先,我們假設這樣一個場景:一個ViewPager里面嵌套一個ViewPager,內部滑動方向和外部滑動方向一樣時,該怎么解決這一沖突呢?
針對滑動沖突這里給出兩種解決方案:外部攔截法,內部攔截法。
外部攔截法
外部攔截法是指點擊事件都先經過父容器的攔截處理,如果父容器需要此攔截事件,就攔截,不需要就不攔截,這種方法比較符合點擊事件的分發機制。這種方法代碼如下:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { ... boolean intercepted=false; switch (action) { case MotionEvent.ACTION_MOVE: intercepted=false; break; case MotionEvent.ACTION_MOVE: if(父容器需要處理此事件) intercepted=true; else intercepted=false; break; case MotionEvent.ACTION_UP: { intercepted=false; break; } ... return intercepted; }
上述代碼是外部攔截的典型邏輯,只需要重寫onInterceptTouchEvent()方法,修改父容器當前需要的事件即可。
內部攔截法
內部攔截法是指:父容器不攔截任何事件,所有事件都傳遞給子元素,如果子元素需要此事件就直接消耗掉,否則就交由父容器處理。這種方法與Android中的事件分發機制不一致,需要配合 requestDisallowInterceptTouchEvent()方法才能正常工作。我們需要重寫子元素的,代碼如下:
public boolean dispatchTouchEvent(MotionEvent event) { ... switch (action) { case MotionEvent.ACTION_MOVE: getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: if(子元素需要處理此事件) getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: { break; } ... return super.dispatchTouchEvent(event);; }
當然,還需要修改父容器的onInterceptTouchEvent()方法,代碼如下:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action=ev.getAction(); if(action==MotionEvent.ACTION_DOWN){ return false; }else { return true; } }
以上就是兩種解決滑動沖突的解決方案,希望對大家的學習有所幫助。
新聞熱點
疑難解答