(1).場景一:外部滑動方向跟內部滑動方向不一致,比如外部左右滑動,內部上下滑動
ViewPager+Fragment配合使用,會有滑動沖突,但是ViewPager內部處理了這種滑動沖突
如果采用的不是ViewPager而是ScrollView就必須手動處理滑動事件
上下滑動時,需要上一級view把消息傳遞進行,因此上一級view的onInterceptTouchEvent方法
return false;左右滑動時需要上一級view執行它的onTouchEvent方法,因此它的onInterceptTouchEvent
方法應該return true;
代碼如下:
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub boolean result=false; switch(ev.getAction()){ case MotionEvent.ACTION_DOWN: //getX()表示以該控件的左上角為0點 //getRawX()表示以屏幕的左上角為0點 firstX=(int) ev.getX(); firstY=(int) ev.getY(); break; case MotionEvent.ACTION_MOVE: //手指在屏幕上水平移動的絕對值 int disX=(int) Math.abs(ev.getX()-firstX); //手指在屏幕上豎直移動的絕對值 int disY=(int) Math.abs(ev.getY()-firstY); if(disX>disY&&disX>10){ result=true; } break; case MotionEvent.ACTION_UP: break; } return result; }
(2).場景二:外部滑動方向跟內部滑動方向一致,內外兩層同時上下或者左右滑動
根據業務需求來判斷
(3).場景三:上面兩種場景的嵌套
(4).滑動沖突的解決方式:
a.外部解決法:父容器對事件判斷是否攔截
b.內部解決法:父容器不攔截任何事件,任何的事件都傳遞給子元素,如果子元素需要此事件就消耗掉,否則就由父容器進行處理。
對於底層的View來說,有一種方法可以阻止父層的View截獲touch事件,就是調用getParent().requestDisallowInterceptTouchEvent(true);
方法。一旦底層View收到touch的action后調用這個方法那么父層View就不會再調用onInterceptTouchEvent了,也無法截獲以后的action。
public boolean dispatchTouchEvent(MotionEvent event){
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
//父控件就不會攔截ListView的滑動事件
parent.requestDisallowInterceptTouchEvent(true);
break;
case MOtionEvent.ACTION_MOVE:
if(父容器需要此類點擊事件){
parent.requestDisallowInterceptTouchEvent(false);
}
break;
}
return super.dispatchTouchEvent(event);
}