Flutter动画标记插件flutter_animarker的使用
Flutter动画标记插件flutter_animarker的使用
flutter_animarker
是一个用于在 Google Maps 中平滑移动 Marker 的 Flutter 插件。它提供了多种功能,如多点线性动画、旋转、波纹效果等。
主要特性
- Marker 位置动画
- 支持同时多个 Marker 动画
- 空安全兼容
- 波纹效果
- 标记旋转或方向
- 多点线性动画(分段线性近似算法)
- 支持动画曲线和持续时间
- 基于 Widget 的自定义行为
- 动画预热以提高性能
- 提供有用的
LocationTween
,AngleTween
和PolynomialLocationInterpolator
注意事项
该插件仅用于动画 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),
),
},
)
使用曲线和持续时间
您可以设置动画的 Curve
和 Duration
来获得所需的效果:
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
更多关于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,
));
});
}
}
在这个示例中,我们:
- 引入了
flutter_animarker
和google_maps_flutter
包。 - 创建了一个Google Map,并设置了初始的相机位置和标记。
- 使用
AnimarkerController
来配置动画标记,包括路径、循环动画和持续时间。 - 在地图上添加了一个初始标记,并在浮动按钮点击时开始动画。
请注意,这个示例假设你已经正确设置了Google Maps API密钥,并且你的设备或模拟器可以访问互联网。
你可以根据需要进一步定制动画效果,比如改变路径、调整动画速度或添加更多的标记。