Android 区分缩放和移动谷歌地图?
我的目标是在相机移动时显示ImageView,但仅在用户移动地图时显示,而不是在放大或缩小时显示。我如何区分这两者 我尝试使用OnCameraMove和OnCameradle侦听器,但缩放已注册为移动,并且OnCameraMoveStartedListener仅在移动是否与用户相关时才能注册Android 区分缩放和移动谷歌地图?,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,我的目标是在相机移动时显示ImageView,但仅在用户移动地图时显示,而不是在放大或缩小时显示。我如何区分这两者 我尝试使用OnCameraMove和OnCameradle侦听器,但缩放已注册为移动,并且OnCameraMoveStartedListener仅在移动是否与用户相关时才能注册 此外,在缩放时,我需要将缩放居中。希望这是有意义的。不幸的是,无法直接区分缩放和移动地图。然而,有一种简单的方法可以实现你想要的。您可以创建扩展FrameLayout的包装器类。在包装器内部重写dispat
此外,在缩放时,我需要将缩放居中。希望这是有意义的。不幸的是,无法直接区分缩放和移动地图。然而,有一种简单的方法可以实现你想要的。您可以创建扩展FrameLayout的包装器类。在包装器内部重写dispatchTouchEvent方法,并实现处理缩放/拖动或区分用户交互所需的任何逻辑。例如,要检测缩放,我们只需确保有两个手指,它们已移动超过某个阈值,并且它们正朝相反方向移动。为此,我们必须覆盖dispatchTouchEvent
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
boolean isPrimMoving = isScrollGesture(event, 0, mPrimStartTouchEventX,
mPrimStartTouchEventY);
boolean isSecMoving = (mPtrCount > 1 && isScrollGesture(event, 1,
mSecStartTouchEventX, mSecStartTouchEventY));
if (mPtrCount > 1 && isPinchGesture(event)) {
Log.d("TAG", "PINCH! OUCH!");
} else if (isPrimMoving || isSecMoving) {
// A 1 finger or 2 finger scroll.
if (isPrimMoving && isSecMoving) {
Log.d("TAG", "Two finger scroll");
} else {
Log.d("TAG", "One finger scroll");
}}
break;
此类将声明一个接口,该接口将根据用户交互更新活动
mTouchView = new myWrapperClass(getActivity());
mTouchView.addView(mOriginalContentView);
return mTouchView;
您需要覆盖onTouch
private float mPrimStartTouchEventX = -1;
private float mPrimStartTouchEventY = -1;
private float mSecStartTouchEventX = -1;
private float mSecStartTouchEventY = -1;
private float mPrimSecStartTouchDistance = 0;
...
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = (event.getAction() & MotionEvent.ACTION_MASK);
switch (action) {
case MotionEvent.ACTION_POINTER_DOWN:
case MotionEvent.ACTION_DOWN:
mPtrCount++;
if (mPtrCount == 1) {
mPrimStartTouchEventX = event.getX(0);
mPrimStartTouchEventY = event.getY(0);
Log.d("TAG", String.format("POINTER ONE X = %.5f, Y = %.5f", mPrimStartTouchEventX, mPrimStartTouchEventY));
}
if (mPtrCount == 2) {
// Starting distance between fingers
mSecStartTouchEventX = event.getX(1);
mSecStartTouchEventY = event.getY(1);
mPrimSecStartTouchDistance = distance(event, 0, 1);
Log.d("TAG", String.format("POINTER TWO X = %.5f, Y = %.5f", mSecStartTouchEventX, mSecStartTouchEventY));
}
break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP:
mPtrCount--;
if (mPtrCount < 2) {
mSecStartTouchEventX = -1;
mSecStartTouchEventY = -1;
}
if (mPtrCount < 1) {
mPrimStartTouchEventX = -1;
mPrimStartTouchEventY = -1;
}
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "Move " + mPtrCount);
break;
}
return true;
}
编辑2:您可以在Android中使用OnTouchListener和ScaleGetStereDetector来检测挤压手势。
有关更多信息:
你能给我一个更详细的解释吗,比如ispinch手势()和isScroll手势()是如何实现的?mPtrCount、mPrim和mSec变量到底是什么?好的,@mente86我将编辑我的帖子并添加这两个方法的实现。请接受我的回答。我对地图进行了缩放,但现在移动地图不起作用,因为mGestureView的onTouch事件将其吃掉。我如何防止这种情况发生,如果只有一个手指接触地图,就移动地图,如果只有两个手指,就让mScaleDetector工作?在onTouch方法中,如果只是滚动返回false,就检测事件的类型。这不起作用,因为检测它是什么类型的事件需要多次调用onTouch方法(像ACTION_DOWN+ACTION_MOVE for drag),但当我第一次在该事件上返回true时,maps drag事件就被吃掉了。如果我能在while循环中运行该switch语句来检测它是什么类型的事件,然后根据它是否为drag返回false或true,就可以找到我要查找的答案。
private boolean isPinchGesture(MotionEvent event) {
if (event.getPointerCount() == 2) {
final float distanceCurrent = distance(event, 0, 1);
final float diffPrimX = mPrimStartTouchEventX - event.getX(0);
final float diffPrimY = mPrimStartTouchEventY - event.getY(0);
final float diffSecX = mSecStartTouchEventX - event.getX(1);
final float diffSecY = mSecStartTouchEventY - event.getY(1);
if (Math.abs(distanceCurrent - mPrimSecStartTouchDistance) > mViewScaledTouchSlop
// and the fingers are moving in opposing directions
&& (diffPrimY * diffSecY) <= 0
&& (diffPrimX * diffSecX) <= 0) {
return true;
}
}
return false;
}
private boolean isScrollGesture(MotionEvent event, int ptrIndex, float originalX, float originalY){
float moveX = Math.abs(event.getX(ptrIndex) - originalX);
float moveY = Math.abs(event.getY(ptrIndex) - originalY);
if (moveX > mViewScaledTouchSlop || moveY > mViewScaledTouchSlop) {
return true;
}
return false;
}
static class MyPinchListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
Log.d("TAG", "PINCH! OUCH!");
return true;
}
}
/* Using it */
ScaleGestureDetector mScaleDetector =
new ScaleGestureDetector(this, new MyPinchListener());
mGestureView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
return true;
}
});