我正在使用compat中的ViewPager
。其中一个页面是一个可以拖动/滚动/平移的地图(无论它叫什么)。
使用原始ViewPager,地图中的几乎每个水平移动都会导致不需要的分页到上一页/下一页,只有当移动中有垂直分量时,才能平移地图。
我想要的是: ViewPager应该只处理fling手势(并使用它们)并让所有其他事件传递给片段上的控件。
我目前最好的解决方案:覆盖ViewPager.canScroll
:
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v instanceof MapView) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
缺点:当浏览页面时,它会在到达地图页面时停止,并且地图正在投掷(不需要的)。
接下来尝试:使用GestureDetector
。这听起来不错,但我没有让它正常工作。我想其中一个问题是我的错误实现,特别是关于onInterceptTouchEvent
。
我已经尝试了很多东西(返回true,false,调用超级方法),但它不能顺利运行(或根本不运行)。
public class FlingableViewPager extends ViewPager {
private GestureDetectorCompat gestureDetector;
public FlingableViewPager(Context context) {
super(context);
init(context);
}
public FlingableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
GestureListener gestureListener = new GestureListener();
gestureDetector = new GestureDetectorCompat(context, gestureListener);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
return true; // super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
return true; // super.onInterceptTouchEvent(event);
}
private void movePage(int direction) {
Log.d(TAG, "movePage " + direction);
int currentItem = getCurrentItem();
if (direction < 0) {
if (currentItem > 0) {
setCurrentItem(currentItem - 1);
}
} else {
int items = getAdapter().getCount();
if (currentItem < items - 1) {
setCurrentItem(currentItem + 1);
}
}
}
private static final int SWIPE_MIN_DISTANCE = 80;
private static final int SWIPE_THRESHOLD_VELOCITY = 150;
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
movePage(1);
return false; // Right to left
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
movePage(-1);
return false; // Left to right
}
return false;
}
}
}
对不起有很多类似的问题,但没有一个能帮助解决这个问题。