【问题标题】:How to handle onTouch event for map in Google Map API v2?如何在 Google Map API v2 中处理地图的 onTouch 事件?
【发布时间】:2012-11-23 06:10:40
【问题描述】:

默认情况下,GoogleMap 不提供地图拖动开始和拖动停止的事件。 I have already reported that problem here.

我想自定义 handler 将使用普通的onTouch 事件并将其与setOnCameraChangeListener 结合起来。

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

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

【问题讨论】:

  • 叠加层呢?他们在 API v2 中还有 onTouchEvent() 回调吗?
  • 不再有覆盖。对于标记和几何对象,他们引入了单独的方法。
  • 为什么不使用 CameraChangeListener?

标签: android google-maps android-mapview google-maps-android-api-2


【解决方案1】:

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

您必须扩展 SupportMapFragmentMapFragment。在onCreateView() 中,您必须将MapView 包装在自定义的FrameLayout 中(在下面的示例中,它是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);
        }
    }
};

【讨论】:

  • 嘿@Alexey Zakharov,请查看 Google 地图问题跟踪器中的主题:code.google.com/p/gmaps-api-issues/issues/…
  • @Alexey Zakharov 我试过了,但我得到了错误:第一个错误是在 getActivity 上。你能发布你自定义的 MapFragment 类声明吗? (或整个代码)
  • 您需要扩展 SupportMapFragment 或 MapFragment。
  • @AZ13,我确实使用了您的解决方案作为基础,但我通过使用自定义侦听器而不是公共静态变量对其进行了改进。请在下面查看我的解决方案。此外,在您的情况下,在 OnCameraChangeListener 中使用 mMapIsTouched 布尔值在大多数情况下都不起作用,因为 OnCameraChangeListener 在更新布尔值之前往往会触发,因此您在 if 中的代码永远不会触发。
  • @AZ13,很棒的答案。如果您或其他任何人有兴趣,我刚刚创建了一个库,用于管理一个可拖动的覆盖框,使用这个答案作为灵感。在这里找到它:github.com/mattlogan/DraggableOverlayBox
【解决方案2】:

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

下面的代码sn -p

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2017-04-23
    • 2019-10-17
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多