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

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

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

标题

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

内容

  • 这个包是flutter_animarker扩展包。
  • 我们添加了onMarkerAnimationListener以实现从地图上平滑移除多边线的功能。

Google Maps Marker Animation - Overview

  • 有时你需要在地图画布上放置一个标记📍,但你还需要平滑地通过Google Maps移动。
  • 这个包将帮助你动画化标记的位置变化和更多功能。
  • 版本v3.0.0包括许多有用的功能,例如:
    • 标记位置动画
    • 同时动画多个标记
    • 兼容Null-safety
    • 覆盖标记位置的涟漪效果
    • 标记的旋转或方向的角度(航向/航向)
    • 多点线性动画(分段线性近似算法)
    • 支持动画曲线和持续时间
    • 基于Widget的完全自定义行为
    • 动画预热以提高性能
    • 有用的LocationTweenAngleTweenPolynomialLocationInterpolator核心逻辑

Note

  • 这个包只动画化标记的变化。地理位置和Google Maps配置超出了这个包的范围。所以在尝试这个包之前,请确保你在Google Map上放置了一个标记或者获取了位置更新。

Screenshots

  • marker_animation
  • multi_markers

Example

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

class SimpleMarkerAnimationExample extends StatefulWidget {
  @override
  SimpleMarkerAnimationExampleState createState() => SimpleMarkerAnimationExampleState();
}

class SimpleMarkerAnimationExampleState extends State<SimpleMarkerAnimationExample> {
  final markers = <MarkerId, Marker>{};
  final controller = Completer<GoogleMapController>();
  final stream = Stream.periodic(Duration(seconds: 2), (count) => LatLng(18.488101, -69.957995)).take(4);

  @override
  void initState() {
    stream.forEach((value) => newLocationUpdate(value));
    super.initState();
  }

  void newLocationUpdate(LatLng latLng) {
    var marker = RippleMarker(
      markerId: MarkerId('MarkerId1'),
      position: latLng,
      ripple: true,
    );
    setState(() => markers[MarkerId('MarkerId1')] = marker);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Google Maps Markers Animation Example',
      home: Animarker(
        curve: Curves.ease,
        mapId: controller.future.then<int>((value) => value.mapId), // Grab Google Map Id
        markers: markers.values.toSet(),
        child: GoogleMap(
          mapType: MapType.normal,
          initialCameraPosition: CameraPosition(target: LatLng(18.488213, -69.959186), zoom: 15),
          onMapCreated: (gController) => controller.complete(gController), // Complete the future GoogleMapController
        ),
      ),
    );
  }
}

Using Ripple Effect

  • 你只需要使用标记包装类RippleMarker,并设置ripple标志以便可以控制涟漪状态。
Animarker(
  rippleRadius: 0.5,  //[0,1.0] range, how big is the circle
  rippleColor: Colors.teal, // Color of fade ripple circle
  rippleDuration: Duration(milliseconds: 2500), //Pulse ripple duration
  markers: <Marker>{
    RippleMarker(
      markerId: MarkerId('MarkerId1'),
      position: LatLng(0, 0),
      ripple: true,  //Ripple state
    ),
    Marker(
      markerId: MarkerId('MarkerId2'),
      position: LatLng(0, 0),
    ),
  },
)

Using Rotation

  • 标记的旋转可以用于Uber-like或送货应用。航向或航向是标记在地球上移动的方向角度。
Animarker(
  useRotation: true, // Actived by default
  markers: <Marker>{
    Marker(
      markerId: MarkerId('MarkerId2'),
      position: LatLng(0, 0),
    ),
  },
)

Using Curve and Duration

  • 就像正常的Flutter动画一样,你可以设置CurveDuration来获得期望的效果或结果。非常灵活,对吧?
Animarker(
  curve: Curves.bounceInOut,
  duration: Duration(milliseconds: 2000),
  markers: <Marker>{
    Marker(
      markerId: MarkerId('MarkerId2'),
      position: LatLng(0, 0),
    ),
  },
)

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

1 回复

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


当然,以下是如何在Flutter中使用google_map_marker_animation插件来实现地图标记动画的一个示例代码。这个插件允许你在Google Maps上创建带有动画效果的标记。

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

dependencies:
  flutter:
    sdk: flutter
  google_maps_flutter: ^2.x.x  # 确保使用兼容的版本
  google_map_marker_animation: ^x.x.x  # 替换为实际的最新版本号

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

接下来是一个完整的示例代码,展示如何使用google_map_marker_animation插件:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_map_marker_animation/google_map_marker_animation.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> {
  final LatLng initialPosition = LatLng(-34.397, 150.644);
  GoogleMapController? _controller;
  MarkerAnimationController? _markerAnimationController;

  @override
  void initState() {
    super.initState();
    // 初始化MarkerAnimationController
    _markerAnimationController = MarkerAnimationController(
      duration: const Duration(seconds: 2),
      curve: Curves.easeInOut,
    );

    // 启动动画
    Future.delayed(Duration.zero, () {
      animateMarker();
    });
  }

  void animateMarker() {
    if (_controller != null && _markerAnimationController != null) {
      _markerAnimationController!.animateMarker(
        _controller!,
        MarkerId('marker'),
        LatLng(-37.8136, 144.9631),  // 动画结束位置
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Map Marker Animation'),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        initialCameraPosition: CameraPosition(
          target: initialPosition,
          zoom: 11.0,
        ),
        onMapCreated: (GoogleMapController controller) {
          _controller = controller;
          
          // 添加初始标记
          _controller!.addMarker(
            MarkerOptions(
              position: initialPosition,
              markerId: MarkerId('marker'),
            ),
          );
        },
        markers: Set.from([
          Marker(
            markerId: MarkerId('marker'),
            position: initialPosition,
          ),
        ]),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 添加了google_maps_fluttergoogle_map_marker_animation依赖。
  2. 创建了一个MapScreen页面,并在其中初始化了Google Map和Marker Animation Controller。
  3. 当地图创建完成时,我们在地图上添加了一个初始标记。
  4. 使用MarkerAnimationController来启动标记的动画,将其从初始位置移动到新的位置。

请注意,你需要确保你的应用有访问Google Maps API的权限,并在AndroidManifest.xmlInfo.plist中正确配置了API密钥。

这个示例展示了基本的动画功能,你可以根据需要进一步自定义动画参数(如持续时间、曲线等)以及添加更多的标记和动画效果。

回到顶部