您的位置:首页 > 移动开发 > Android开发

解决内部ViewPager不能向左滑动的bug

2017-05-06 15:35 417 查看
今天在做一个商城app的时候,顶部使用的是ViewPager进行轮播图显示的,外部集成的是SlidingMenu和ViewPager,当内部的第一个ViewPager向左滑动的时候,直接打开了左侧菜单而不能实现图片的切换,这个时候就要自定义ViewPager,重写dispatchTouchEvent方法,请求父视图不要拦截事件。但是这样做又带来了一个新的问题,当反拦截以后,外部的SlidingMenu和ViewPager将不再响应事件。所以反拦截是有条件的。一.竖直方向滑动,不做处理
设置是否拦截事件为 getParent().requestDisallowInterceptTouchEvent(false);

二.水平方向滑动1.当滑动到第一个页面,并且方向是从左到右的滑动
endX - startX > 0 那么方向就是:从左往右滑动 getParent().requestDisallowInterceptTouchEvent(false);

2.当滑动到最后一个页面的时候,并且方向是从右到左滑动endX - startX < 0 那么方向就是:从右往左滑动
getParent().requestDisallowInterceptTouchEvent(false);

3.其他情况getParent().requestDisallowInterceptTouchEvent(true);具体代码如下 private float lastX;
private float lastY;

@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{

switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
// down的时候要先把事件传到最里面 然后根据情况是否是父亲拦截
getParent().requestDisallowInterceptTouchEvent(true);
lastX = ev.getRawX();
lastY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float dx = ev.getRawX() - lastX;
float dy = ev.getRawY() - lastY;
//判断是水平滑动还是垂直滑动
if (Math.abs(dx) > Math.abs(dy))
{
//水平滑动
if (getCurrentItem() == 0 && dx > 0)
{
//从左向右滑 不请求
getParent().requestDisallowInterceptTouchEvent(false);
}
else if (getCurrentItem() == getAdapter().getCount() - 1 && dx < 0)
{
getParent().requestDisallowInterceptTouchEvent(false);
}
else
{
getParent().requestDisallowInterceptTouchEvent(true);
}
}
else
{
//垂直滑动 不请求
getParent().requestDisallowInterceptTouchEvent(false);

}

break;
case MotionEvent.ACTION_UP:

break;
}
return super.dispatchTouchEvent(ev);
}这样顶部ViewPager及外面的SlidingMenu和ViewPager切换就正常了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息