(1).場景一:外部滑動方向跟內部滑動方向不一致,比如外部左右滑動,內部上下滑動 ViewPager+Fragment配合使用,會有滑動衝突,但是ViewPager內部處理了這種滑動衝突 如果採用的不是ViewPager而是ScrollView就必須手動處理滑動事件 上下滑動時,需要上一級view把 ...
(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);
}