Flutter地图动画标记插件flutter_mapbox_animarker的使用

Flutter地图动画标记插件flutter_mapbox_animarker的使用

介绍

此插件允许在Mapbox地图上平滑地动画化标记。通过动态添加和移动标记,可以基于实时位置来实现这些动画。

特性

  • 动态向地图上添加标记。
  • 在不同位置之间平滑地动画化标记。
  • 支持位置和旋转动画曲线。
  • 可自定义标记属性,如大小、不透明度和旋转。
  • 轻松从地图上移除标记。

注意事项

该插件仅负责标记变化的动画。Mapbox的配置不在该插件的范围内。因此,在尝试使用该插件之前,请确保已正确配置您的Mapbox地图,并且了解如何向地图添加标记。

安装

要使用此插件,请将以下依赖项添加到您的pubspec.yaml文件中:

dependencies:
  flutter_mapbox_animarker: ^0.0.9
  # 其他依赖项

添加标记

您可以动态添加一个或多个标记,并传递标记的运动数据,如下所示:

final markerAnimator = MarkerAnimator(mapboxMap);
markerAnimator.addMarkerPoint(
  'markerId123',
  'assets/marker_icon.png',  // 标记图像路径
  [
    {'position': [longitude, latitude], 'rotation': 0},
    {'position': [longitude2, latitude2], 'rotation': 30},
    // 根据需要添加更多位置
  ],
  interval: 0.05,  // 可选:动画帧之间的间隔
  properties: {
    "icon-opacity": 0.9,
    "icon-size": 1.2,
  }
);

移除标记

要从地图上移除标记:

await markerAnimator.removeMarker();

自定义标记属性

您可以为标记传递自定义属性:

Map<String, dynamic> customProperties = {
  "icon-opacity": 0.8,
  "icon-size": 1.5,
  "icon-anchor": "center",
  'icon-allow-overlap': true,
};

markerAnimator.addMarkerPoint(
  'markerId456',
  'assets/another_marker_icon.png',
  data,  // 标记运动数据
  properties: customProperties,
);

标记样式属性

属性应遵循Mapbox Style Specification中的符号层规范。这些属性允许您控制图标大小、不透明度、旋转、锚点位置等。

注意事项

  • 标记运动数据应包括位置和旋转列表。
  • 动画间隔控制标记过渡的速度。较小的间隔会产生更平滑的动画。
  • 确保正确处理Mapbox API密钥和地图初始化。

完整示例代码

以下是完整的示例代码,演示如何使用flutter_mapbox_animarker插件:

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_mapbox_animarker/flutter_mapbox_animarker.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Mapbox Animarker Example')),
        body: MapboxExample(),
      ),
    );
  }
}

class MapboxExample extends StatefulWidget {
  [@override](/user/override)
  _MapboxExampleState createState() => _MapboxExampleState();
}

class _MapboxExampleState extends State<MapboxExample> {
  final MarkerAnimator markerAnimator = MarkerAnimator(MapboxMap());

  [@override](/user/override)
  void initState() {
    super.initState();

    // 初始化时添加标记
    addMarkers();
  }

  void addMarkers() {
    // 添加第一个标记
    markerAnimator.addMarkerPoint(
      'markerId123',
      'assets/marker_icon.png',  // 标记图像路径
      [
        {'position': [116.4074, 39.9042], 'rotation': 0}, // 北京
        {'position': [121.4737, 31.2304], 'rotation': 30}, // 上海
      ],
      interval: 0.05,  // 可选:动画帧之间的间隔
      properties: {
        "icon-opacity": 0.9,
        "icon-size": 1.2,
      }
    );

    // 添加第二个标记
    Map<String, dynamic> customProperties = {
      "icon-opacity": 0.8,
      "icon-size": 1.5,
      "icon-anchor": "center",
      'icon-allow-overlap': true,
    };

    markerAnimator.addMarkerPoint(
      'markerId456',
      'assets/another_marker_icon.png',
      [
        {'position': [106.5915, 29.5629], 'rotation': 0}, // 重庆
        {'position': [108.9548, 34.2633], 'rotation': 30}, // 西安
      ],
      properties: customProperties,
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FlutterMap(
      options: MapOptions(
        center: LatLng(39.9042, 116.4074), // 初始中心点
        zoom: 4.0,
      ),
      layers: [
        TileLayerOptions(
          urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
          subdomains: ['a', 'b', 'c'],
        ),
        MarkerLayerOptions(
          markers: [],
        ),
      ],
    );
  }
}

更多关于Flutter地图动画标记插件flutter_mapbox_animarker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_mapbox_animarker插件来实现地图动画标记的一个示例代码案例。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_mapbox_animarker: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你需要在你的项目中配置Mapbox访问令牌。你可以在Mapbox官网创建一个账户并获取一个访问令牌。

以下是一个完整的示例代码,展示了如何使用flutter_mapbox_animarker插件来实现地图动画标记:

import 'package:flutter/material.dart';
import 'package:flutter_mapbox_animarker/flutter_mapbox_animarker.dart';
import 'package:flutter_mapbox_gl/flutter_mapbox_gl.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MapScreen(),
    );
  }
}

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  late MapboxMapController mapController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Mapbox Animarker Example'),
      ),
      body: MapboxMap(
        accessToken: '你的Mapbox访问令牌', // 请替换为你的实际Mapbox访问令牌
        mapOptions: MapOptions(
          styleUrl: MapboxStyles.STREETS,
          center: LatLng(37.7749, -122.4194), // 初始地图中心
          zoom: 14.0,
        ),
        onMapCreated: (MapboxMapController controller) {
          mapController = controller;
          _addAnimatedMarker();
        },
      ),
    );
  }

  void _addAnimatedMarker() async {
    // 定义动画路径的坐标点
    List<LatLng> coordinates = [
      LatLng(37.7749, -122.4194),
      LatLng(37.7759, -122.4184),
      LatLng(37.7769, -122.4174),
      LatLng(37.7779, -122.4164),
    ];

    // 创建动画标记
    AnimarkerOptions animarkerOptions = AnimarkerOptions(
      coordinates: coordinates,
      duration: Duration(seconds: 5), // 动画持续时间
      loop: true, // 是否循环播放
      bearing: 0.0,
      pitch: 0.0,
      speedProfile: const [
        SpeedProfilePoint(distanceFraction: 0.0, speed: 1.0),
        SpeedProfilePoint(distanceFraction: 0.5, speed: 2.0),
        SpeedProfilePoint(distanceFraction: 1.0, speed: 1.0),
      ],
      markerOptions: MarkerOptions(
        icon: BitmapDescriptor.defaultMarker,
      ),
    );

    // 添加动画标记到地图
    await mapController.addAnimarker(animarkerOptions);
  }
}

代码解释:

  1. 依赖配置

    • pubspec.yaml中添加flutter_mapbox_animarker依赖。
  2. Mapbox访问令牌

    • MapboxMap组件中,使用accessToken属性提供你的Mapbox访问令牌。
  3. 地图创建

    • 使用MapboxMap组件创建地图,并设置初始地图中心、缩放级别等。
  4. 动画标记

    • 定义一个包含多个LatLng坐标点的路径。
    • 使用AnimarkerOptions配置动画标记的参数,如持续时间、是否循环播放、速度曲线等。
    • 使用mapController.addAnimarker(animarkerOptions)将动画标记添加到地图上。

这样,你就可以在Flutter应用中实现一个带有动画标记的Mapbox地图了。希望这个示例对你有帮助!

回到顶部