将ScaleGestureDetector与GestureDetector一起使用?

mra*_*tor 5 multi-touch android-imageview onfling pinchzoom

在我的Android应用程序中,我有一个ImageView地方,我希望用户能够将其向左/向右/向上/向下推动以将图像(静态地图)更改为相邻的图像.但另外,我想要捏缩放功能和地图本身.

我可以投掷或捏缩放工作,但不能在一起.我正在使用GestureDetector(带有SimpleOnGestureListener)用于投掷.我正在使用ScaleGestureDetector(来自Making Sense of Multitouch)进行缩放.

难点在于确定在触摸动作时调用哪个手势监听器.这不是编码问题,而是逻辑问题.单手触摸动作时,它是甩尾还是刻度?即使使用双指缩放,初始MotionEvent也是ACTION_DOWN.我一直在尝试使用图像大小(内在或缩放?)作为决策点.但是使用ACTION_DOWN初始缩放操作(当图像大小是内在的并且我想放大它时)似乎让我感到厌烦.

有没有人以前成功解决过这个问题?

aij*_*aij 6

您可以将事件传递给两个手势检测器.

查看"更复杂的缩放示例"下的http://developer.android.com/training/gestures/scale.html:

public boolean onTouchEvent(MotionEvent event) {
    boolean retVal = mScaleGestureDetector.onTouchEvent(event);
    retVal = mGestureDetector.onTouchEvent(event) || retVal;
    return retVal || super.onTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

当然,考虑到Ratatat引用的错误,在上面的示例中永远不会调用super.onTouchEvent,根据您的使用情况,可能会也可能不会.


小智 2

终于在链接上找到了答案: http://code.google.com/p/android/issues/detail ?id=42591

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean result = mScaleGestureDetector.onTouchEvent(event);

    // result is always true here, so I need another way to check for a detected scaling gesture
    boolean isScaling = result = mScaleGestureDetector.isInProgress();
    if (!isScaling) {
        // if no scaling is performed check for other gestures (fling, long tab, etc.)
        result = mCommonGestureDetector.onTouchEvent(event);
    }

    // some irrelevant checks...

    return result ? result : super.onTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)