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

来源:互联网 发布:淘宝银泰百货旗舰店 编辑:程序博客网 时间:2024/06/06 05:42

今天在做一个商城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切换就正常了。

0 0
原创粉丝点击