gpt4 book ai didi

android - 区分缩放和移动 Google map ?

转载 作者:太空狗 更新时间:2023-10-29 14:41:12 27 4
gpt4 key购买 nike

我的目标是让 ImageView 在相机移动时出现,但仅在用户移动 map 时出现,而不是在放大或缩小时出现。如何区分这两者?

我尝试使用 OnCameraMove 和 OnCameraIdle 监听器,但缩放被注册为移动,而 OnCameraMoveStartedListener 只能在移动是否与用户相关时注册。

此外,在缩放时我需要将缩放居中。希望这是有道理的。

最佳答案

遗憾的是,无法立即区分缩放和移动 map 。但是,有一种 hacky 方法可以完成您正在寻找的东西。您可以创建一个扩展 FrameLayout 的包装器类。在包装器内部覆盖 dispatchTouchEvent 方法并实现处理缩放/拖动或区分用户交互所需的任何逻辑。例如,为了检测缩放,我们只想确保有 2 根手指,它们的移动超过了某个阈值,并且它们在相反的方向上移动。为此,我们必须重写 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;

此类将声明一个接口(interface),该接口(interface)将根据用户交互更新 Activity 。然后,在您的 fragment 中启动此类

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;
}

编辑:在 isPinchGestureisScrollGesture 的实现下方

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;
}

编辑 2:您可以使用 ScaleGestureDetector 使用 OnTouchListener 在 Android 中检测捏合手势。更多信息:https://developer.android.com/training/gestures/scale.html

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;
}
});

关于android - 区分缩放和移动 Google map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com