Flutter标记追踪插件marker_tracker的使用
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';
示例
以下是在 FlutterMap
的 onMapEvent
中使用 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
更多关于Flutter标记追踪插件marker_tracker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用marker_tracker
插件的基本示例。marker_tracker
插件通常用于在地图应用中实现标记追踪功能。在这个例子中,我们将展示如何在Google Maps上实现标记追踪。
首先,确保你已经在pubspec.yaml
文件中添加了marker_tracker
和google_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'));
});
}
}
代码解释:
- 依赖项:我们在
pubspec.yaml
中添加了google_maps_flutter
和marker_tracker
依赖项。 - 主应用:
MyApp
是一个简单的Flutter应用,它包含了一个MarkerTrackerDemo
页面。 - MarkerTrackerDemo:这是一个有状态的Widget,它包含了地图和用于控制标记追踪的按钮。
- GoogleMap:在地图上显示了一个标记,并在地图创建完成后初始化了
MarkerTracker
。 - MarkerTracker:我们创建了一个
MarkerTracker
实例,并传入了一个标记。我们还设置了一个回调函数来处理标记位置的变化。 - FloatingActionButton:一个浮动按钮用于切换标记追踪状态。
注意事项:
- 请确保你已经在Google Cloud平台上设置了API密钥,并在
AndroidManifest.xml
和Info.plist
中正确配置。 marker_tracker
插件可能需要一些额外的配置或权限,具体请参考其官方文档。- 本示例代码是基于假设的最新版本,实际使用时请检查并更新到最新版本。
这个示例展示了如何在Flutter应用中使用marker_tracker
插件来实现标记追踪功能。希望这对你有所帮助!