在我的Android应用程序中,我有一个ImageView
,我希望用户能够向左/向右/向上/向下移动以将图像(静态地图)更改为相邻的图像。但另外,我想要捏缩放功能和地图本身。
我可以投掷或捏缩放工作,但不能在一起。我正在使用GestureDetector
(带SimpleOnGestureListener
)进行投掷。我正在使用ScaleGestureDetector
(来自Making Sense of Multitouch)进行缩放。
难点在于确定在触摸动作时调用哪个手势监听器。这不是编码问题,而是逻辑问题。单手触摸动作时,它是甩尾还是刻度?即使使用捏拉缩放,初始MotionEvent
也是ACTION_DOWN。我一直在尝试使用图像大小(内在或缩放?)作为决策点。但是使用ACTION_DOWN初始缩放操作(当图像大小是内在的并且我想放大它时)似乎让我感到厌烦。
有没有人以前成功解决过这个问题?
答案 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);
}