如何办理地图在谷歌地图API第2 onTouch事件?(How to handle onTouch

2019-06-21 14:36发布

GoogleMap的默认情况下不提供地图拖曳开始并拖动停止事件。 我已经报道,问题就在这里 。

我想进行自定义 handler将使用纯onTouch事件,并结合它setOnCameraChangeListener

但是我没有找到我怎么能访问onTouch的事件GoogleMap对象。 它不提供这样的回调

我不知道如何可以处理onTouch事件地图在谷歌地图API第2?

Answer 1:

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

你必须扩展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);
    }
    }

在您的自定义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);
        }
    }
};


Answer 2:

还有一个更简单的方法来做到这一点,在处理您的案件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();
    }
}


文章来源: How to handle onTouch event for map in Google Map API v2?