1

对于同一个问题,我已经阅读了一些不同的回答,所以我不知道哪个是正确的,然后我决定再问一次。请尽量不要在此答案中引用任何其他链接。如果你想这样做,我会期待一些额外的解释。

我的问题是:我有一个ImageViewinside a ViewPager,我ImageView有一些手势检测(缩放和平移),我使用的是默认的ViewPager,默认情况下有滑动检测。 onTouch 事件链是如何工作的?我的层次结构中的最低视图将始终获得 onTouch,如果方法返回 false,父级会处理它吗?也许相反?

我问这个,因为我有一个ImageView左右手势,当我进入图像边缘时,我必须向父级(a ViewPager)发送一个事件来处理分页事件。关于如何做的任何进一步提示,将不胜感激。

4

2 回答 2

2

所以,我已经以比 onInterceptTouchEvent 更好的方式管理 ViewPager 的子视图中的多次触摸,我是说,因为在我的情况下,为了知道我是否必须滚动子视图而不是 Pager,我需要起点和终点之间的距离,我不想保留这些变量并在之后计算增量。

无论如何,在进入 ViewPager 的源代码之后,我发现有一个非常好的方法,我应该为此实现。这是我的实现:

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v instanceof ImageViewTouch) {
        return ((ImageViewTouch) v).canScroll(dx);
    } else {
        return super.canScroll(v, checkV, dx, x, y);
    }
}

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.java#ViewPager.canScroll%28android。 view.View%2Cboolean%2Cint%2Cint%2Cint%29

于 2012-06-26T19:10:57.893 回答
1

它的工作原理相反,ViewPager 先吃触摸事件,然后 ImageView 会得到它。

我会在自定义视图寻呼机上使用 onInterceptTouchEvent(MotionEvent ev)。在 MotionEvent 上,您需要通过 ev.getPointerCount() 分析有多少接触点。

如果您有 ev.getPointerCount() == 2,您可能希望在 ImageView 内进行捏合和缩放。

如果您有 ev.getPointerCount() == 1,那么您可能打算在 View Pager 的页面中滑动或在 ImageView 中执行平移。为了区分这两者,您需要弄清楚您是用一根手指执行滑动手势还是简单的 MotionEvent.MOVE 进行平移。滑动手势要求用户超过预定义的速度。GestureDetector 应该为您解决这个问题。

于 2012-06-25T20:56:43.207 回答