ViewPager嵌套ViewPager,内层ViewPager

本文介绍了一种自定义ViewPager的实现方式,该方式能够根据不同条件判断并改变滑动行为,例如在首尾页时允许水平翻转整个模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

安静//第一页响应父类的左滑,最后一页响应父类的右滑

public class RollViewPager extends ViewPager {
    public RollViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    int downX = 0; int downY = 0;
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //int downX = 0;        这里赋值downX,downY会一直为0;要转为成员变量
       // int downY = 0;
        //y轴方向需要考虑移动整个模块,让其支持下拉刷新

        //在用系统的事件处理机制之前,先让自定义的viewpager满足我们自己定义的规则
        //viewpager选中最后一个点的时候,由右向左滑动,需要让整个模块进行翻转
        //viewpager选中第一个点的时候,由左向右滑动,需要让整个模块进行翻转
        //其余情况,翻转viewpager中的图片
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                downX = (int) ev.getX();
                downY = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveX = (int) ev.getX();
                int moveY = (int) ev.getY();

                if(Math.abs(moveX-downX)<Math.abs(moveY-downY)){
                    //y轴上的偏移量比x轴上的偏移量更多,可能会触发下拉刷新,需要响应事件的是大的模块

                    //请求不拦截触摸事件(不是这样的,要拦截)
                    getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                }else{
                    //x轴偏移量大于y轴偏移量情况
                    if (moveX-downX<0){
                        //由右向左移动,最后一个点,翻转整个模块
                        if (getCurrentItem() == getAdapter().getCount()-1){
                            getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                        }else if (getCurrentItem()<getAdapter().getCount()-1){
                            getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
                        }
                    }else{
                        //由左向右移动,第一个点,翻转整个模块
                        if (getCurrentItem() == 0){
                            getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                        }else if (getCurrentItem()>0){
                            getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
                        }
                    }
                }
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值