关于Tablayout包含Viewpager,滑动view pager到最后一个子view,继续滑动导致切换到Tablayout第二个fragment的问题

如题,本来我是上面tablayout+viewpager然后view pager这个Afragment里面还是有个view pager图片,可以左右划的,之前没注意,因为滑动到最后一张图片的时候,继续滑动就会使tablayout切换到第二个Bfragment上面去,产品说不行,要滑倒最后一张图片的时候不能滑动,不能切换到另一个页面。。类似与这样的,没办法,那就去快乐星球去研究吧。。研究一上午,还算成功了吧,下面直接贴代码,只需要在xml里面替换左右滑动的viewpager就行了,如果不对,不负责任的哦。。

public class TabLyoutScrollViewPager extends ViewPager {

    public TabLyoutScrollViewPager(Context context) {
        super(context);
    }

    public TabLyoutScrollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    float aFloatX, aFloatY;

  
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    super.onInterceptTouchEvent(ev);
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            aFloatX = ev.getX();
            aFloatY = ev.getY();
            //告诉父view不要拦截事件,如果不在点击的时候加这句话,父view会处理滑动事件
            getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_MOVE:
            float xDifference = Math.abs(ev.getX() - aFloatX);
            float yDifference = Math.abs(ev.getY() - aFloatY);
            //点击造成的滑动误差
            if (xDifference < 10 && yDifference < 10) {
                return false;
            }
            Boolean intercepted = intercepted(ev.getX(), ev.getY());
            if (!intercepted) {
                //告诉父view不要拦截事件,并且自己消费事件,不然左右滑动的时候点击事件抢占焦点导致滑动不流畅
                getParent().requestDisallowInterceptTouchEvent(true);
                return true;
            } else {
                //请求父view拦截事件,可以上下滑动
                getParent().requestDisallowInterceptTouchEvent(false);
            }
            break;
        default:
    }
    //告诉父view不要拦截事件
    //  getParent().requestDisallowInterceptTouchEvent(true);
    return false;
}
    /**
     * 判断是否拦截
     *
     * @return Boolean
     */
    private Boolean intercepted(Float x, Float y) {
        float xDifference = Math.abs(x - aFloatX);
        float yDifference = Math.abs(y - aFloatY);
        //根据距离差判断
        if (yDifference > xDifference) {
            //如果Y轴距离差大于X轴则拦截
            return true;
        }
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        //viewpager才能滑动
        super.onTouchEvent(ev);
        //设置未true,子view没有消耗点击事件,则会把事件传递个父view的onTouchEvent。所以这边设置为true,表示由这个viewpager消耗,不传递到上一级父view
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值