32

默认情况下,GoogleMap 不提供地图拖动开始和拖动停止的事件。我已经在这里报告了这个问题

我想定制 handler将使用普通onTouch事件并将其与setOnCameraChangeListener.

但是我找不到如何访问对象onTouch的事件GoogleMap。它不提供这样的回调

我想知道如何在Google Map API v2中处理地图的 onTouch 事件?

4

2 回答 2

41

这是确定拖动开始和拖动结束事件的可能解决方法:

你必须扩展SupportMapFragmentMapFragment。在onCreateView()您必须将您MapView的自定义包装FrameLayout(在下面的示例中是 class TouchableWrapper),您可以在其中拦截触摸事件并识别地图是否被点击。如果您onCameraChange被调用,只需检查是否按下了地图视图(在下面的示例中,这是变量mMapIsTouched)。

示例代码:

更新 1:

  • 返回原始创建的视图getView()
  • 使用dispatchTouchEvent()而不是onInterceptTouchEvent()

自定义框架布局:

private class TouchableWrapper extends FrameLayout {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
        mMapIsTouched = true;
        break;

    case MotionEvent.ACTION_UP:
        mMapIsTouched = false;
        break;
        }

        return super.dispatchTouchEvent(ev);
    }
    }

在您自定义的 MapFragment 中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);

    mTouchView = new TouchableWrapper(getActivity());
    mTouchView.addView(mOriginalContentView);

    return mTouchView;
}

@Override
public View getView() {
    return mOriginalContentView;
}

在您的相机更改回调方法中:

private final OnCameraChangeListener mOnCameraChangeListener = new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        if (!mMapIsTouched) {
            refreshClustering(false);
        }
    }
};
于 2012-12-05T16:39:34.297 回答
6

有一种更简单的方法可以做到这一点,onCameraMoveStarted像这样处理你的监听器案例

在代码片段下方

@Override
public void onCameraMoveStarted(int reason) {
    if (reason == OnCameraMoveStartedListener.REASON_GESTURE) {
        Toast.makeText(this, "The user gestured on the map.",
                       Toast.LENGTH_SHORT).show();
    } else if (reason == OnCameraMoveStartedListener
                            .REASON_API_ANIMATION) {
        Toast.makeText(this, "The user tapped something on the map.",
                       Toast.LENGTH_SHORT).show();
    } else if (reason == OnCameraMoveStartedListener
                            .REASON_DEVELOPER_ANIMATION) {
        Toast.makeText(this, "The app moved the camera.",
                       Toast.LENGTH_SHORT).show();
    }
}
于 2017-11-22T09:45:19.530 回答