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);
}
}