假如ScrollView中嵌套一个ViewPager,
那么,在手势操作时会发现,ViewPager的左右滚动有时会失效,因为它的上级是一个可以上下滚动的ScrollView
这种情况我们称之为:滑动冲突
解法方案有二,一是外部拦截法,二是内部拦截法。
推荐使用外部拦截!内部拦截的灵敏度貌似不如外部拦截!
以下代码仅为模板,具体的拦截我略去了,读者可自行添加。
外部拦截法
package com.che.carcheck.ui.home;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;
/**
* 外部拦截法
* <p>
* 案例:ScrollView嵌套ViewPager
* <p>
* 作者:余天然 on 16/5/8 下午5:17
*/
public class OuterScrollView extends ScrollView {
public OuterScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean isIntercept = false;
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
isIntercept = false;
break;
case MotionEvent.ACTION_MOVE:
isIntercept = canOuterIntercept(ev);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
isIntercept = false;
break;
}
return isIntercept;
}
/**
* 自定义外部拦截手势的逻辑
*
* @param ev
* @return
*/
private boolean canOuterIntercept(MotionEvent ev) {
return false;
}
}
内部拦截法
package com.che.carcheck.ui.home;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 内部拦截法
* <p>
* 案例:ScrollView嵌套ViewPager
* <p>
* 作者:余天然 on 16/5/8 下午5:27
*/
public class InnerViewPager extends ViewPager {
public InnerViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if(canInnerIntercept(ev)){
//通知上级不要拦截手势
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
break;
}
return super.dispatchTouchEvent(ev);
}
/**
* 自定义内部拦截手势的逻辑
*
* @param ev
* @return
*/
private boolean canInnerIntercept(MotionEvent ev) {
return false;
}
}