如何使用 Flutter Here SDK 检测地图中的平移手势

How to detect pan gesture in map with Flutter Here SDK

我正在使用 Flutter 构建一个应用程序,我正在尝试听取地图的平移手势以获取地图视图的中心并在中心放置一个图钉。我试过的代码如下:

void _setPanGestureHandler({HereMapController mapController}) {
    
    _hereMapController.gestures.panListener = PanListener.fromLambdas(
        lambda_onPan: (GestureState gestureState, Point2D panStartPoint,
            Point2D panEndPoint, double panVelocity) {
      if (gestureState == GestureState.begin) {
        print("start pan");
      } else if (gestureState == GestureState.end) {
        var centerPointLat = _hereMapController.viewportSize.width / 2;
        var centerPointLong = _hereMapController.viewportSize.height / 2;
        GeoCoordinates geoCoordinates = _hereMapController
            .viewToGeoCoordinates(Point2D(centerPointLat, centerPointLong));
        if (geoCoordinates == null) {
          return;
        }
        _addPoiMapMarker(geoCoordinates);
        _getAddressForCoordinates(geoCoordinates);
      } else if (gestureState == GestureState.update) {
        print("pan updated");
      } else if (gestureState == GestureState.cancel) {
        print("pan cancelled");
      }
    });
  }

该代码是 search_app 示例的一部分,我刚刚为其添加了一个 panGesture 侦听器。

平移时,我在调试控制台中得到以下信息

W/PanGestureDetector(21446): [WARN ] PanGestureDetector - Invalid panning of zero duration but nonzero length, skipping
W/PanGestureDetector(21446): [WARN ] PanGestureDetector - Invalid panning of zero duration but nonzero length, skipping

请告诉我如何解决这个问题。

您问题中的代码片段不是 search_app 示例的一部分,因此我认为这是您的代码。但是,您尝试执行的操作将无法正常工作:

  • _hereMapController.viewportSize 为您提供地图视图的大小(以像素为单位)。它不提供地理坐标。虽然您可以使用 viewToGeoCoordinates() 将像素点转换为地理坐标,但有一个更简单的方法:MapCamera 通过 targetCoordinates 属性 始终免费为您提供当前中心位置.
  • 平移手势处理程序被执行了多次。每次 GestureState.end 事件发生时都调用 _addPoiMapMarker() 是不可取的。相反,您可以通过设置新的 coordinates.
  • 来重新定位现有标记

从您的代码来看,您似乎想要获取地图视图中心的地址。我假设您不希望每次地图停止移动时都重新定位标记。因此,在您的情况下,最好在地图视图的中心绘制一个固定的小部件,而不管它的当前坐标是什么——这样它就不会移动或落后于任何事件,例如你可能会从 MapCameraObserver.

您收到的日志消息只是警告,因此它们不会影响您收到的平移手势事件。