将ScaleGestureDetector与GestureDetector一起使用?

时间:2013-03-09 10:35:48

标签: android-imageview multi-touch pinchzoom onfling

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

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

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

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

3 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:3)

Ratatat's answer的想法还可以,但即使我们不想滚动,我们仍然应该将事件传递给gestureDetector,否则它将被搞砸。

我最终得到了类似的东西:

scaleDetector = new ScaleGestureDetector( ... );

gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if (scaleDetector.isInProgress()) {
            // don't allow scrolling while scaling
            return false;
        }

        // handle scrolling

        return true;
    }
}

然后onTouchEvent的实施应该像aij's answer中那样:

boolean result = scaleDetector.onTouchEvent(event);
result = gestureDetector.onTouchEvent(event) || result;
return result || super.onTouchEvent(event);

答案 2 :(得分:1)

终于在链接上找到了答案: 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);
}