左右滑动的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);
}