在做APP首页的时候,往往是一个ListView控件,然后里面还有ViewPager作为广告页,有时候我们在滑动ViewPager的时候,往往感觉有些卡顿,这是因为在滑动ViewPager的时候,有的事件被ListView拦截消耗了,因此需要我们解决滑动冲突。
public class MyViewPager extends ViewPager {
private float startX;
private float startY;
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//手指按下记录xy的位置
startX=ev.getX();
startY=ev.getY();
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
//我们希望如果横向滑动距离大于纵向滑动距离,肯定是要操作viewpager
//所以此处要告诉父控件不要拦截事件,否则事件交给父控件来处理
if(Math.abs(ev.getX()-startX)>Math.abs(ev.getY()-startY)){
getParent().requestDisallowInterceptTouchEvent(true);
}else{
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(false);
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
}
解决方法就是重写ViewPager的dispatchTouchEvent方法,通过计算滑动的距离来控制父容器是否对事件进行拦截,里面涉及到requestDisallowInterceptTouchEvent方法,在我的这篇博客有所讲解。