Android高級-裏層的ViewPager滑動完畢後外層的ViewPager再滑動

android ViewPager嵌套使用的滑動衝突解決方案,優先讓裏層的ViewPager滑動完畢後外層的ViewPager再滑動
Android 從ViewPager嵌套的滑動問題引發的分析

package io.github.luizgrp.sectionedrecyclerviewadapter.demo.viewpager;

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.viewpager.widget.ViewPager;

public class MuiltViewPager extends ViewPager {
    public MuiltViewPager(@NonNull Context context) {
        super(context);
    }


    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(ev);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if (v != this && v instanceof 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");
                return false;
            }
            return true;
        }

        Log.e("view_pager", "canScroll:----------3");

        return super.canScroll(v, checkV, dx, x, y);
    }

    private int downX;
    private int downY;

    @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);
                }
            default:
                break;
        }


        return super.dispatchTouchEvent(ev);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章