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

Ale*_*rov 31 android google-maps android-mapview google-maps-android-api-2

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

我想制作将使用普通事件并将其与之结合的自定义 .handleronTouchsetOnCameraChangeListener

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

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

AZ1*_*Z13 41

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

你必须延长SupportMapFragmentMapFragment.在onCreateView()你必须包装你MapView的自定义FrameLayout(例如下面是它的类TouchableWrapper),你在其中拦截触摸事件并识别地图是否被点击.如果你onCameraChange被调用,只需检查地图视图是否被按下(例如下面这是变量mMapIsTouched).

示例代码:

更新1:

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

自定义FrameLayout:

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);
    }
    }
Run Code Online (Sandbox Code Playgroud)

在您自定义的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;
}
Run Code Online (Sandbox Code Playgroud)

在你的相机更改回调方法:

private final OnCameraChangeListener mOnCameraChangeListener = new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        if (!mMapIsTouched) {
            refreshClustering(false);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)


Fla*_*Nes 7

有一种更简单的方法可以做到这一点,在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();
    }
}
Run Code Online (Sandbox Code Playgroud)