思路分析
1.開始子view需要滑動,所以要獲取事件,即此時父view不能攔截事件
2. 後期父view需要滑動,此時父view需要進行攔截,獲取事件
將上面的分析轉化爲僞代碼:
//子view
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//進行反攔截,保證子view獲取down事件, 否則後續事件無法獲取
parent.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
if(子view需要滑動){//禁止父view攔截
parent.requestDisallowInterceptTouchEvent(true);
}else {//允許父view攔截事件
parent.requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
//父view
public boolean onInterceptTouchEvent(MotionEvent event){
int action = event.getAction();
if(action == MotionEvent.ACTION_DOWN){
return false;
}else{
return true;
}
}
場景示例
這類場景,父view一般都是ScrollView,內部已經有事件處理,只需關注子view就行。如ScrollView嵌套ScrollView或ListView,只需重寫子view的dispatchTouchEvent方法即可:
private float downY;
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downY = event.getY();
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
if(Math.abs(downY - event.getY()) < 200){
getParent().requestDisallowInterceptTouchEvent(true);
}else {
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}