Flutter动画标记插件flutter_animarker的使用

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

Flutter动画标记插件flutter_animarker的使用

flutter_animarker 是一个用于在 Google Maps 中平滑移动 Marker 的 Flutter 插件。它提供了多种功能,如多点线性动画、旋转、波纹效果等。

主要特性

  • Marker 位置动画
  • 支持同时多个 Marker 动画
  • 空安全兼容
  • 波纹效果
  • 标记旋转或方向
  • 多点线性动画(分段线性近似算法)
  • 支持动画曲线和持续时间
  • 基于 Widget 的自定义行为
  • 动画预热以提高性能
  • 提供有用的 LocationTween, AngleTweenPolynomialLocationInterpolator

注意事项

该插件仅用于动画 Marker 的位置变化,地理定位和 Google Maps 配置不在插件范围内,请确保您已经在地图上放置了 Marker 或获取了位置更新。

示例代码

简单 Marker 动画示例

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

// 设置虚拟值
const kStartPosition = LatLng(18.488213, -69.959186);
const kSantoDomingo = CameraPosition(target: kStartPosition, zoom: 15);
const kMarkerId = MarkerId('MarkerId1');
const kDuration = Duration(seconds: 2);
const kLocations = [
  kStartPosition,
  LatLng(18.488101, -69.957995),
  LatLng(18.489210, -69.952459),
  LatLng(18.487307, -69.952759),
];

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(kDuration, (count) => kLocations[count]).take(kLocations.length);

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

  @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), // 获取 Google Map Id
        markers: markers.values.toSet(),
        child: GoogleMap(
          mapType: MapType.normal,
          initialCameraPosition: kSantoDomingo,
          onMapCreated: (gController) => controller.complete(gController), // 完成 Future GoogleMapController
        ),
      ),
    );
  }

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

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

使用波纹效果

使用波纹效果只需将 RippleMarker 包装类中的 ripple 标志设置为 true

Animarker(
  rippleRadius: 0.5,  // [0,1.0] 范围,圆圈大小
  rippleColor: Colors.teal, // 渐变波纹圆的颜色
  rippleDuration: Duration(milliseconds: 2500), // 波纹脉冲持续时间
  markers: <Marker>{
    RippleMarker(
      markerId: MarkerId('MarkerId1'),
      position: LatLng(0, 0),
      ripple: true,  // 波纹状态
    ),
    Marker(
      markerId: MarkerId('MarkerId2'),
      position: LatLng(0, 0),
    ),
  },
)

使用旋转

对于类似 Uber 或送货应用,可以启用 Marker 的旋转:

Animarker(
  useRotation: true, // 默认激活
  markers: <Marker>{
    Marker(
      markerId: MarkerId('MarkerId2'),
      position: LatLng(0, 0),
    ),
  },
)

使用曲线和持续时间

您可以设置动画的 CurveDuration 来获得所需的效果:

Animarker(
  curve: Curves.bounceInOut,
  duration: Duration(milliseconds: 2000),
  markers: <Marker>{
    Marker(
      markerId: MarkerId('MarkerId2'),
      position: LatLng(0, 0),
    ),
  },
)

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

1 回复

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


当然,以下是一个关于如何使用Flutter动画标记插件flutter_animarker的代码示例。这个插件通常用于在地图上实现动画标记,比如展示车辆或用户的移动轨迹。

首先,确保你的Flutter项目中已经添加了flutter_animarker依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_animarker: ^最新版本号  # 请替换为实际的最新版本号
  google_maps_flutter: ^2.0.6  # 地图插件,通常与flutter_animarker一起使用

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

接下来是一个简单的示例代码,展示如何在Google Maps上使用flutter_animarker来创建动画标记:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter_animarker/flutter_animarker.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 GoogleMapController _controller;
  late AnimarkerController _animarkerController;

  final Set<Marker> _markers = {};
  final List<LatLng> _coordinates = [
    LatLng(37.7749, -122.4194), // San Francisco
    LatLng(34.0522, -118.2437), // Los Angeles
    LatLng(36.1699, -115.1398), // Las Vegas
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          GoogleMap(
            mapType: MapType.normal,
            initialCameraPosition: CameraPosition(
              target: LatLng(36.7783, -119.4179), // Central California
              zoom: 7.0,
            ),
            markers: _markers.toSet(),
            onMapCreated: (GoogleMapController controller) {
              _controller = controller;
              _setupAnimarker();
            },
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _animarkerController.startAnimation();
        },
        tooltip: 'Start Animation',
        child: Icon(Icons.play_arrow),
      ),
    );
  }

  void _setupAnimarker() {
    _animarkerController = AnimarkerController(
      mapController: _controller,
      markers: _markers,
      path: _coordinates,
      loop: true, // 循环动画
      duration: Duration(seconds: 10), // 动画持续时间
      onAnimationUpdate: (LatLng position) {
        // 可以在这里添加额外的逻辑,比如更新UI元素
        print('Current position: $position');
      },
    );

    // 初始标记
    setState(() {
      _markers.add(Marker(
        markerId: MarkerId('start'),
        position: _coordinates.first,
      ));
    });
  }
}

在这个示例中,我们:

  1. 引入了flutter_animarkergoogle_maps_flutter包。
  2. 创建了一个Google Map,并设置了初始的相机位置和标记。
  3. 使用AnimarkerController来配置动画标记,包括路径、循环动画和持续时间。
  4. 在地图上添加了一个初始标记,并在浮动按钮点击时开始动画。

请注意,这个示例假设你已经正确设置了Google Maps API密钥,并且你的设备或模拟器可以访问互联网。

你可以根据需要进一步定制动画效果,比如改变路径、调整动画速度或添加更多的标记。

回到顶部