ViewPager禁止滑动,设置页片间距,设置当前显示的页面,缓存个数,以及解决嵌套ViewPager左右滑动冲突问题

使用一个类继承ViewPager,重写onTouchEvent,dispatchTouchEvent方法,皆返回false,禁止滑动


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return false;//去掉父类处理事件能力,自己不消费
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return false;//返回false禁止父类分发事件
    }

设置页片间距mViewPager.setPageMargin(45);//其中数字为像素

设置当前显示的页面 mViewPager.setCurrentItem(1); //默认索引0开始既是第一个

设置缓存个数mViewPager.setOffscreenPageLimit(3)`;//默认为1,左右各缓存一个

2,因嵌套ViewPager左右滑动问题,可以通过dispatchTouchEvent的方法判断是否是左右滑动,再通过getParent().requestDisallowInterceptTouchEvent请求父容器


public class ChildViewPager extends ViewPager {


    private int downX;
    private int downY;

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

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

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        if (action==MotionEvent.ACTION_DOWN){
            downX = (int) ev.getX();
            downY = (int) ev.getY();
            getParent().requestDisallowInterceptTouchEvent( true);
        }else if (action==MotionEvent.ACTION_MOVE){
            int moveX = (int) ev.getX();
            int moveY = (int) ev.getY();
            int dx = moveX - downX;
            int dY = moveY - downY;
            //通过计算滑动的绝对值判断上下还是左右滑动  上下滑动 由父容器处理
            if (Math.abs(dx)<Math.abs(dY)){
                getParent().requestDisallowInterceptTouchEvent(false);
            }else {
                //第一页并且手指是从右向左滑动不处理事件
                if (getCurrentItem()==0 &&dx>0){
                    getParent().requestDisallowInterceptTouchEvent(false);
                }else if (getCurrentItem()==getAdapter().getCount()-1 &&dx<0){ //最后一页并且手指是从左向右滑动不处理事件
                    getParent().requestDisallowInterceptTouchEvent(false);
                }else {
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
            }
        }
        return super.dispatchTouchEvent(ev);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值