Flutter中是否有可在Google Maps默认Marker内加图标的第三方Package?
Flutter中创建内嵌图标的Google Maps自定义Marker方案
是的,有多种方式可以实现你要的这种在默认Marker内部添加图标的效果,既可以基于官方包原生实现,也有第三方工具包简化流程:
1. 基于官方google_maps_flutter原生实现(无需额外包)
你可以通过将自定义Widget(组合默认Marker样式+内嵌图标)转换为BitmapDescriptor来实现:
- 先创建一个包含默认Marker形状和内嵌图标的Widget,比如用
Stack堆叠带三角形底部的圆形容器与目标图标; - 通过
RepaintBoundary和图片编码工具将Widget转为字节数组; - 把字节数组转为
BitmapDescriptor,赋值给Marker的icon属性。
示例代码片段:
// 生成自定义Marker的BitmapDescriptor Future<BitmapDescriptor> createCustomMarker() async { final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); final Canvas canvas = Canvas(pictureRecorder); // 绘制默认Marker的红色圆形主体 Paint paint = Paint()..color = Colors.red; canvas.drawCircle(const Offset(25, 25), 25, paint); // 绘制底部三角形 Path trianglePath = Path(); trianglePath.moveTo(0, 50); trianglePath.lineTo(25, 70); trianglePath.lineTo(50, 50); trianglePath.close(); canvas.drawPath(trianglePath, paint); // 绘制内嵌图标(以本地asset图标为例) final ByteData data = await rootBundle.load('assets/icons/your_icon.png'); final ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List()); final ui.FrameInfo frameInfo = await codec.getNextFrame(); final ui.Image image = frameInfo.image; canvas.drawImage(image, const Offset(15, 15), Paint()); final ui.Picture picture = pictureRecorder.endRecording(); final ui.Image img = await picture.toImage(50, 70); final ByteData? byteData = await img.toByteData(format: ui.ImageByteFormat.png); return BitmapDescriptor.fromBytes(byteData!.buffer.asUint8List()); } // 使用自定义Marker Marker( markerId: const MarkerId('custom_marker'), position: const LatLng(37.4219999, -122.0840575), icon: await createCustomMarker(), )
2. 第三方包简化流程
如果不想手动编写画布绘制逻辑,可以用以下第三方包快速实现:
flutter_custom_marker:支持直接将Widget转为Marker图标,可轻松组合默认Marker样式与内嵌图标,省去手动编码的繁琐;marker_generator:提供预设Marker模板,允许在模板内添加自定义图标、文字等内容,直接生成符合需求的Marker。
这类包的核心逻辑和原生实现一致,都是将自定义Widget转为BitmapDescriptor,但封装了重复代码,能提升开发效率。
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

