Flutter标记追踪插件marker_tracker的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter标记追踪插件marker_tracker的使用

marker_tracker 是一个帮助跟踪地图上标记位置的 Flutter 包,即使这些标记移动到可视区域之外。它计算出一个指向标记相对于地图可见区域方向的偏移量,这在显示方向指示器或引导用户找到当前视图外的标记时非常有用。

特性

  • 方向偏移:当标记位于地图可视范围之外时,提供一个指示标记方向的偏移量。
  • 兼容流行的地图库:与如下的地图库无缝配合工作:
    • google_maps_flutter
    • flutter_map
  • 动态跟踪:实时处理地图移动和缩放级别。

安装

marker_tracker 添加到你的 pubspec.yaml 文件中:

dependencies:
  marker_tracker: latest_version

使用

首先,在你的 Dart 文件中导入 marker_tracker 包:

import 'package:marker_tracker/marker_tracker.dart';

示例

以下是在 FlutterMaponMapEvent 中使用 MarkerTracker 的示例代码:

final bound = mapController.camera.visibleBounds;

MarkerTracker.calculateOffset(
    centerLat: mapController.camera.center.latitude,
    centerLng: mapController.camera.center.longitude,
    trackLat: 16.819376,
    trackLng: 96.178474,
    mapWidth: mapWidth,
    mapHeight: mapHeight,
    trackerSize: trackerSize,
    isCheckOutOfBound: true,
    southWestLat: bound.southWest.latitude,
    southWestLng: bound.southWest.longitude,
    northEastLat: bound.northEast.latitude,
    northEastLng: bound.northEast.longitude,
    onGetOffset: (offset) {
    if (offset == null) {
        print(xShow.value);
        if (xShow.value) xShow.value = false;
    } else {
        if (!xShow.value) xShow.value = true;
        trackerPosition.value = offset;
    }
    },
);

在地图上方的堆栈中放置跟踪器:

ValueListenableBuilder<bool>(
    valueListenable: xShow,
    builder: (BuildContext context, bool value, Widget? child) {
        return ValueListenableBuilder<Offset>(
        valueListenable: trackerPosition,
        builder: (context, position, child) {
            return Positioned(
            left: position.dx - trackerSize / 2,
            top: position.dy - trackerSize / 2,
            child: AnimatedSwitcher(
                duration: const Duration(milliseconds: 200),
                transitionBuilder: (child, animation) =>
                    ScaleTransition(
                scale: animation,
                child: child,
                ),
                child: !value
                    ? const SizedBox.shrink()
                    : Container(
                        width: trackerSize,
                        height: trackerSize,
                        decoration: const BoxDecoration(
                            shape: BoxShape.circle,
                            color: Colors.red),
                        child: const Icon(
                        Icons.location_pin,
                        color: Colors.white,
                        size: 30,
                        ),
                    ),
            ),
            );
        },
        );
    },
    ),

更多关于Flutter标记追踪插件marker_tracker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter标记追踪插件marker_tracker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用marker_tracker插件的基本示例。marker_tracker插件通常用于在地图应用中实现标记追踪功能。在这个例子中,我们将展示如何在Google Maps上实现标记追踪。

首先,确保你已经在pubspec.yaml文件中添加了marker_trackergoogle_maps_flutter依赖项:

dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^2.1.1  # 请检查最新版本号
  marker_tracker: ^0.2.0  # 请检查最新版本号

然后,运行flutter pub get来安装这些依赖项。

接下来,创建一个Flutter应用并在其中使用marker_tracker。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:marker_tracker/marker_tracker.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Marker Tracker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MarkerTrackerDemo(),
    );
  }
}

class MarkerTrackerDemo extends StatefulWidget {
  @override
  _MarkerTrackerDemoState createState() => _MarkerTrackerDemoState();
}

class _MarkerTrackerDemoState extends State<MarkerTrackerDemo> {
  final Completer<GoogleMapController> _controller = Completer();
  MarkerTracker? _markerTracker;
  LatLng _initialCameraPosition = LatLng(37.7749, -122.4194); // 旧金山

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Marker Tracker Demo'),
      ),
      body: Stack(
        children: [
          GoogleMap(
            mapType: MapType.hybrid,
            initialCameraPosition: CameraPosition(
              target: _initialCameraPosition,
              zoom: 14.0,
            ),
            onMapCreated: (GoogleMapController controller) {
              _controller.complete(controller);
              _initMarkerTracker(controller);
            },
            markers: Set<Marker>.of(_markerTracker?.markers ?? {}),
          ),
          if (_markerTracker != null)
            Positioned(
              bottom: 10,
              right: 10,
              child: FloatingActionButton(
                onPressed: () {
                  _markerTracker?.toggleTracking();
                },
                tooltip: 'Toggle Tracking',
                child: Icon(
                  _markerTracker?.isTracking ?? false
                      ? Icons.pause
                      : Icons.play_arrow,
                ),
              ),
            ),
        ],
      ),
    );
  }

  void _initMarkerTracker(GoogleMapController controller) {
    setState(() {
      _markerTracker = MarkerTracker(
        controller: controller,
        markers: {
          Marker(
            markerId: MarkerId('trackingMarker'),
            position: _initialCameraPosition,
            infoWindow: InfoWindow(title: 'Tracking Marker'),
            icon: BitmapDescriptor.defaultMarker,
          ),
        },
        onMarkerPositionChanged: (MarkerId markerId, LatLng position) {
          print('Marker $markerId moved to $position');
          // 这里可以添加逻辑来处理标记位置的变化,比如更新UI等
        },
      );

      // 开始追踪标记
      _markerTracker?.startTracking(MarkerId('trackingMarker'));
    });
  }
}

代码解释:

  1. 依赖项:我们在pubspec.yaml中添加了google_maps_fluttermarker_tracker依赖项。
  2. 主应用MyApp是一个简单的Flutter应用,它包含了一个MarkerTrackerDemo页面。
  3. MarkerTrackerDemo:这是一个有状态的Widget,它包含了地图和用于控制标记追踪的按钮。
  4. GoogleMap:在地图上显示了一个标记,并在地图创建完成后初始化了MarkerTracker
  5. MarkerTracker:我们创建了一个MarkerTracker实例,并传入了一个标记。我们还设置了一个回调函数来处理标记位置的变化。
  6. FloatingActionButton:一个浮动按钮用于切换标记追踪状态。

注意事项:

  • 请确保你已经在Google Cloud平台上设置了API密钥,并在AndroidManifest.xmlInfo.plist中正确配置。
  • marker_tracker插件可能需要一些额外的配置或权限,具体请参考其官方文档。
  • 本示例代码是基于假设的最新版本,实际使用时请检查并更新到最新版本。

这个示例展示了如何在Flutter应用中使用marker_tracker插件来实现标记追踪功能。希望这对你有所帮助!

回到顶部