【问题标题】:Disable my-location when user moves the map and re-enable when he press the my-location button当用户移动地图时禁用我的位置并在他按下我的位置按钮时重新启用
【发布时间】:2013-04-05 09:08:36
【问题描述】:

我正在使用 Google Maps Android API v2 中的 setMyLocationEnabled(true) 进行自动位置跟踪并像 Google Maps 应用程序一样显示指示器。我需要相机位置跟随我的位置指示器,以便它始终可见,除非用户平移地图。

所以,我正在使用onMyLocationChange 方法将相机移动到新位置,但是当用户平移地图或使用我的应用程序中的搜索字段时,onMyLocationChange 会继续被调用并且相机始终回到我的位置坐标。

如何在启用我的位置时自动移动相机,在手动操作地图(平移、旋转或搜索)时禁用它,并在用户按下我的位置按钮时启用它?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    编辑:

    现在有GoogleMap.setOnMyLocationButtonClickListener,因此您可以跳过第 1 点并使用它。


    2 月版的 Maps API v2 无法做到这一点。您能做的最好的事情是:

    1. 拥有您自己的“转到我的位置”按钮,以了解您何时想要开始跟踪
    2. 您自己的位置变化监听器
    3. View 位于 SupportMapFragment 之上和 onTouchListener(返回 false!)以了解何时需要停止跟踪

    这个解决方案并不完美,因为它会在用户放大平移之前停止跟踪 - 当他们第一次触摸地图时它会停止,但我认为这是一个不会给用户带来任何混淆的解决方案:他们触摸了地图,所以可以期待跟踪停止并可以按下按钮启动它。

    【讨论】:

      【解决方案2】:

      那么,当用户与TextView 交互时,为什么不直接调用setMyLocationEnabled(false)

      您可以与地图检查的唯一交互是:

      map.setOnMapClickListener(listener);
      map.setOnMapLongClickListener(listener);
      map.setOnMarkerClickListener(listener);
      map.setOnMarkerDragListener(listener);
      

      您可以对这些交互执行相同的操作来禁用my-location layer

      【讨论】:

      • 如果我禁用它,我的位置按钮将被移除。
      • 我从未使用过 setMyLocationEnabled 方法,你有 onLocationChangeListenr 和 onMyLocationChange 方法吗?如果是,则仅当用户不与 TextView 或地图交互时才执行 onMyLocationChange 操作。使用 TextWatcher 和我在答案中提供的地图方法进行检查。
      【解决方案3】:

      从方法中删除这两行(如果有的话)

      @Override
      public void onLocationChanged(Location location) {
            //Remove these two lines
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用 setOnCameraMoveStartedListener 中的 REASON_GESTURE 来检测用户手势。

        mMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() {
            @Override
            public void onCameraMoveStarted(int reason) {
                if (reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE) {
                    //Camera motion initiated in response to user gestures on the map.
                } else if (reason == GoogleMap.OnCameraMoveStartedListener.REASON_API_ANIMATION){
                    //Non-gesture animation initiated in response to user actions.
                } else if (reason == GoogleMap.OnCameraMoveStartedListener.REASON_DEVELOPER_ANIMATION){
                    //Developer initiated animation.
                }
            }
        });
        

        查看文档了解更多详情:https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnCameraMoveStartedListener

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-16
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 2015-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多