左右滑动的ViewPager嵌套上下滑动的ViewPager滑动冲突怎么解决

66 阅读1分钟

左右滑动的viewPager: private float mLastX;
private float mLastY;

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mLastY = event.getY();
return super.onInterceptTouchEvent(event);
case MotionEvent.ACTION_MOVE:
float currentX = event.getX();
float currentY = event.getY();
float deltaX = Math.abs(currentX - mLastX);
float deltaY = Math.abs(currentY - mLastY);
if (deltaY > deltaX) {
// 上下滑动
return false;
} else {
// 左右滑动
return true;
}
default:
return super.onInterceptTouchEvent(event);
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mLastY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float currentX = event.getX();
float currentY = event.getY();
float deltaX = Math.abs(currentX - mLastX);
float deltaY = Math.abs(currentY - mLastY);
if (deltaY > deltaX) {
// 上下滑动
return false;
} else {
// 左右滑动
return super.onTouchEvent(event);
}
default:
break;
}
return super.onTouchEvent(event);
}

上下滑动:

public class VerticalViewPager extends ViewPager {
private SwipeDirection direction;
private float initialYValue;

public VerticalViewPager(Context context) {
super(context);
init();
}

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

private void init() {
setPageTransformer(true, new VerticalPageTransformer());
setOverScrollMode(OVER_SCROLL_NEVER);
direction = SwipeDirection.NONE;

}

private MotionEvent swapXY(MotionEvent ev) {
float width = getWidth();
float height = getHeight();

float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;

ev.setLocation(newX, newY);

return ev;
}

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

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialYValue = event.getY();
break;

case MotionEvent.ACTION_MOVE:
if (initialYValue > event.getY()) {
direction = SwipeDirection.TOP;
} else {
direction = SwipeDirection.DOWN;
}
break;

case MotionEvent.ACTION_UP:
if (Math.abs(initialYValue - event.getY()) > (getHeight() / 3f)) {
if (direction == SwipeDirection.TOP) {
setCurrentItem(getCurrentItem() + 1);
} else if (direction == SwipeDirection.DOWN) {
setCurrentItem(getCurrentItem() - 1);
}
direction = SwipeDirection.NONE;
return true;
}
break;
}
return super.onTouchEvent(swapXY(event));
}

private class VerticalPageTransformer implements ViewPager.PageTransformer {

@Override
public void transformPage(View view, float position) {

if (position < -1) {
view.setAlpha(0);

} else if (position <= 1) {
view.setAlpha(1);

view.setTranslationX(view.getWidth() * -position);

float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);

} else {
view.setAlpha(0);
}
}
}

private enum SwipeDirection {
DOWN, TOP, NONE
}
}

然后写一个viewPager继承与VerticalViewPager

private float mLastX;
private float mLastY;
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mLastY = event.getY();
return super.onInterceptTouchEvent(event);
case MotionEvent.ACTION_MOVE:
float currentX = event.getX();
float currentY = event.getY();
float deltaX = Math.abs(currentX - mLastX);
float deltaY = Math.abs(currentY - mLastY);
if (deltaY > deltaX) {
// 上下滑动
return true;
} else {
// 左右滑动
return false;
}
default:
return super.onInterceptTouchEvent(event);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mLastY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float currentX = event.getX();
float currentY = event.getY();
float deltaX = Math.abs(currentX - mLastX);
float deltaY = Math.abs(currentY - mLastY);
if (deltaY > deltaX) {
// 上下滑动
Log.d("NestedViewPager", "onTouchEvent: 上下滑动");
return super.onTouchEvent(event);
} else {
// 左右滑动
Log.d("NestedViewPager", "onTouchEvent: 左右滑动");
return false;
}
default:
break;
}
return super.onTouchEvent(event);
}