ViewPager仅处理fling手势,但让其他MotionEvent由片段

时间:2017-01-14 23:56:09

标签: android android-viewpager android-appcompat gesturedetector

我正在使用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;
    }

}

}

对不起有很多类似的问题,但没有一个能帮助解决这个问题。

0 个答案:

没有答案