Flutter标记图标插件marker_icon的使用
Flutter标记图标插件marker_icon的使用
概述
marker_icon
是一个用于将Flutter中的Widget、本地图片、网络图片和SVG文件转换为 BitmapDescriptor
的插件,这些 BitmapDescriptor
可以在 google_maps_flutter
中用作地图标记(Marker)的图标。
开始使用
添加依赖
首先,在 pubspec.yaml
文件中添加 marker_icon
依赖:
dependencies:
marker_icon: ^0.7.1
添加带边框的圆形网络图片标记
以下代码展示了如何从网络图片创建一个带边框的圆形标记图标,并将其添加到地图上:
onPressed: () async {
markers.add(
Marker(
icon: await MarkerIcon.downloadResizePictureCircle(
'https://thegpscoordinates.net/photos/la/tehran_iran_5u679ezi8f.jpg',
size: 150,
addBorder: true,
borderColor: Colors.white,
borderSize: 15,
),
),
);
}
注意事项
- 异步函数:你必须在异步函数中添加标记。
- 其他函数:除了将Widget转换为标记外,所有其他函数的工作方式与此类似。
将Widget转换为标记
MyMap 类包含Google Map小部件
MyMap
类用于管理Google Map小部件,并处理将自定义Widget转换为标记图标的功能。
class MyMap extends StatefulWidget {
const MyMap({Key? key}) : super(key: key);
[@override](/user/override)
_MyMapState createState() => _MyMapState();
}
class _MyMapState extends State<MyMap> {
Set<Marker> _markers = <Marker>{};
final GlobalKey globalKey = GlobalKey();
[@override](/user/override)
Widget build(BuildContext context) {
return Stack(
children: [
Scaffold(
body: Stack(
children: [
// 将你的Widget添加到同一个Widget树中
// 在Stack中添加Google Map
// 在Google Map之前声明标记
// 将全局键传递给你的Widget
MyMarker(globalKey),
Positioned.fill(
child: GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(32.4279, 53.6880),
zoom: 15,
),
markers: _markers,
),
),
],
),
floatingActionButton: FloatingActionButton.extended(
label: FittedBox(child: Text('Add Markers')),
onPressed: () async {
// 调用widgetToIcon函数并传递相同的全局键
_markers.add(
Marker(
markerId: MarkerId('circleCanvasWithText'),
icon: await MarkerIcon.widgetToIcon(globalKey),
position: LatLng(35.8400, 50.9391),
),
);
setState(() {});
},
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
),
],
);
}
}
MyMarker 类包含要转换为标记图标的自定义Widget
MyMarker
类用于定义要转换为标记图标的自定义Widget。
class MyMarker extends StatelessWidget {
MyMarker(this.globalKeyMyWidget);
final GlobalKey globalKeyMyWidget;
[@override](/user/override)
Widget build(BuildContext context) {
return RepaintBoundary(
key: globalKeyMyWidget,
child: Stack(
alignment: Alignment.center,
children: [
Container(
width: 250,
height: 180,
decoration: BoxDecoration(color: Colors.black, shape: BoxShape.circle),
),
Container(
width: 220,
height: 150,
decoration: BoxDecoration(color: Colors.amber, shape: BoxShape.circle),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.accessibility,
color: Colors.white,
size: 35,
),
Text(
'Widget',
style: TextStyle(color: Colors.white, fontSize: 25),
),
],
),
),
],
),
);
}
}
现在我们有了来自自定义Widget的标记
函数列表
marker_icon
提供了以下功能:
widgetToMarker
:从自定义Widget创建标记图标。svgAsset
:从资产文件夹中的SVG文件创建标记图标。pictureAsset
:从资产文件夹中的图片(png、jpeg等)创建标记图标。pictureAssetWithCenterText
:从资产文件夹中的图片(png、jpeg等)创建带有中心文本的标记图标。circleCanvasWithText
:创建带有中心文本的圆形画布标记图标。downloadResizePicture
:从互联网下载并调整大小的图片创建标记图标。downloadResizePictureCircle
:从互联网下载并调整大小的圆形图片(带边框)创建标记图标。
完整示例代码
以下是一个完整的示例代码,展示了如何使用 marker_icon
插件来创建不同类型的标记图标并将其添加到Google Map上。
import 'package:flutter/rendering.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter/material.dart';
import 'package:marker_icon/marker_icon.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
[@override](/user/override)
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Set<Marker> _markers = <Marker>{};
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
initialCameraPosition: CameraPosition(target: LatLng(32.4279, 53.6880), zoom: 15),
markers: _markers,
),
floatingActionButton: FloatingActionButton.extended(
label: FittedBox(child: Text('Add Markers')),
onPressed: () async {
// 添加带有中心文本的圆形画布标记
_markers.add(
Marker(
markerId: MarkerId('circleCanvasWithText'),
icon: await MarkerIcon.circleCanvasWithText(
size: Size(80, 80),
text: 'Hi',
circleColor: Colors.red,
fontColor: Colors.white,
fontSize: 22,
),
position: LatLng(35.8400, 50.9391),
),
);
// 添加从互联网下载并调整大小的图片标记
_markers.add(
Marker(
markerId: MarkerId('downloadResizePicture'),
icon: await MarkerIcon.downloadResizePicture(
url: 'https://thegpscoordinates.net/photos/la/tehran_iran_5u679ezi8f.jpg',
imageSize: 150,
),
position: LatLng(35.6892, 51.3890),
),
);
// 添加从互联网下载并调整大小的圆形图片(带边框)标记
_markers.add(
Marker(
markerId: MarkerId('downloadResizePictureCircle'),
icon: await MarkerIcon.downloadResizePictureCircle(
'https://thegpscoordinates.net/photos/la/tehran_iran_5u679ezi8f.jpg',
size: 150,
addBorder: true,
borderColor: Colors.white,
borderSize: 15,
),
position: LatLng(34.6416, 50.8746),
),
);
setState(() {});
},
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
);
}
}
更多关于Flutter标记图标插件marker_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter标记图标插件marker_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用marker_icon
插件(假设你指的是用于地图标记图标的插件,虽然Flutter生态系统中没有一个直接名为marker_icon
的官方插件,但通常会使用flutter_map
和相应的图标包来实现标记图标功能)的示例代码。这里我们将使用flutter_map
和flutter_svg
(用于加载SVG图标)来展示如何在地图上添加自定义标记图标。
首先,确保在pubspec.yaml
文件中添加必要的依赖项:
dependencies:
flutter:
sdk: flutter
flutter_map: ^0.14.0 # 请检查最新版本号
latlong2: ^0.8.0 # flutter_map的依赖之一
flutter_svg: ^0.22.0 # 用于加载SVG图标
然后,运行flutter pub get
来安装这些依赖项。
接下来,是一个完整的Flutter应用示例,展示如何在地图上添加自定义SVG图标作为标记:
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:flutter_svg/flutter_svg.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Map with Marker Icon'),
),
body: MapPage(),
),
);
}
}
class MapPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlutterMap(
options: MapOptions(
center: LatLng(51.5, -0.09), // 地图中心点
zoom: 13.0,
),
layers: [
TileLayerOptions(
urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
subdomains: ['a', 'b', 'c'],
),
MarkerLayerOptions(
markers: [
Marker(
width: 80.0,
height: 80.0,
point: LatLng(51.5, -0.09), // 标记位置
builder: (ctx) => Container(
child: SvgPicture.asset(
'assets/marker_icon.svg', // 自定义SVG图标路径
width: 40,
height: 40,
color: Colors.red, // 可以根据需要设置颜色
),
),
),
],
),
],
);
}
}
在这个示例中,我们做了以下几件事:
- 添加了
flutter_map
和flutter_svg
作为依赖项。 - 创建了一个简单的Flutter应用,其中包含一个地图页面。
- 在地图页面上,我们使用了
FlutterMap
组件,并设置了地图的中心点、缩放级别和图层。 - 添加了一个
TileLayerOptions
,它指定了OpenStreetMap的瓦片URL模板。 - 添加了一个
MarkerLayerOptions
,其中包含了一个标记(Marker
),该标记使用了一个自定义的SVG图标。
请确保将assets/marker_icon.svg
替换为你自己的SVG图标文件的路径,并将该SVG文件添加到你的Flutter项目的assets
文件夹中,并在pubspec.yaml
中声明它:
flutter:
assets:
- assets/marker_icon.svg
这样,你就可以在Flutter应用中成功使用自定义标记图标了。