android ViewPager嵌套使用的滑动冲突解决方案,优先让里层的ViewPager滑动完毕后外层的ViewPager再滑动


很多时候,因为开发需要,往往需要进行ViewPager的嵌套进行使用,是的里层的ViewPager显示后优先滑动,然后再外层的viewPager滑动,解决思路:

1、判读里层的是不是ViewPager,如果是判断是Viewpager的第几个,如果是第1个并且是往左边滑动或者是最后一个并且是往右滑动就外层的ViewPager滑动

否则就里层的ViewPager滑动:


上代码、、、、、、所以可以对外层的ViewPager进行子View的判断:重写ViewPager

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;



public class MuiltViewPager extends ViewPager {




    public MuiltViewPager(Context context) {
        this(context, null);
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Log.e("dong", "onInterceptTouchEvent");

        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        Log.e("dong", "onTouchEvent");


        return super.onTouchEvent(ev);
    }




    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if (v != this && v instanceof ViewPager) {   //判断当前的View是不是ViewPager
            Log.e("view_pager", "canScroll: ------------------1    "+dx );
            int currentItem = ((ViewPager) v).getCurrentItem();   //当前的条目
            int countItem = ((ViewPager) v).getAdapter().getCount();  //总的条目
            Log.e("view_pager", "canScroll: ------------------1 "+dx );
            if ((currentItem == (countItem - 1) && dx < 0) || (currentItem == 0 && dx > 0)) {   //判断当前条目以及滑动方向
                Log.e("dong", "canScroll perform");
                Log.e("view_pager", "canScroll: ------------------2     "+dx  );
                return false;
            }
            return true;
        }
        Log.e("view_pager", "canScroll: ------------------3     "+dx );
        return super.canScroll(v, checkV, dx, x, y);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.e("dong", "dispatchTouchEvent");
        return super.dispatchTouchEvent(ev);
    }


}

试了一把,没有太大的问题,,,,功能也算部分完成。。。。。外层的ViewPager使用重写的ViewPager,里层的就可使用正常的Viewpager;


方法二:重写里层的ViewPager,外层的ViewPager采用正常的ViewPager

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
 * 这个使用的时候放置在里层,外层使用正常的ViewPager,
* */
public class MuiltsViewPager extends ViewPager {

    private int downX;
    private int downY;

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

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

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                getParent().requestDisallowInterceptTouchEvent(true);
                downX = (int) ev.getX();
                downY = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveX = (int) ev.getX();
                int moveY = (int) ev.getY();

                int diffX = downX - moveX;
                int diffY = downY - moveY;

                if (Math.abs(diffX) > Math.abs(diffY)) {
                    // 当前是横向滑动
                    if (getCurrentItem() == 0 && diffX < 0) {
                        // 当前页面等于第一个页面, 并且是从左向右滑动, 可以拦截
                        getParent().requestDisallowInterceptTouchEvent(false);
                    } else if (getCurrentItem() == (getAdapter().getCount() - 1)
                            && diffX > 0) {
                        // 当前页面等于最后一个, 并且是从右向左滑动, 可以拦截
                        getParent().requestDisallowInterceptTouchEvent(false);
                    } else {
                        // 自己处理
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                } else {
                    // 竖着滑动, 可以拦截
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
}

又测试了一把,没有太大问题,打完收工。。。。。。



希望对大家有帮助吧!



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android中实现左右滑动动画,可以使用ViewPager。ViewPager是一个视图容器,可以让用户在屏幕上左右滑动,以便浏览多个页面。 下面是一些步骤,以实现ViewPager左右滑动翻页效果: 1. 在布局文件中添加ViewPager。 ```xml <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" /> ``` 2. 在MainActivity中,创建一个PagerAdapter类,它将管理页面。 ```java public class MyPagerAdapter extends PagerAdapter { private List<View> viewList; public MyPagerAdapter(List<View> viewList) { this.viewList = viewList; } @Override public int getCount() { return viewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(viewList.get(position)); return viewList.get(position); } } ``` 3. 在MainActivity中,为ViewPager设置PagerAdapter。 ```java ViewPager viewPager = findViewById(R.id.viewPager); List<View> viewList = new ArrayList<>(); viewList.add(new View(this)); viewList.add(new View(this)); viewList.add(new View(this)); MyPagerAdapter adapter = new MyPagerAdapter(viewList); viewPager.setAdapter(adapter); ``` 现在,当用户在ViewPager中左右滑动时,页面将滑动到下一页,实现了左右滑动翻页效果。 当然,你可以在PagerAdapter中添加自己的View,以实现更多的自定义效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值