Flutter 中如何调整 GoogleMap 标记(Marker)尺寸并适配屏幕
解决方案
你的代码中fromAssetImage传入的size参数未生效,是因为ImageConfiguration缺少设备像素比配置,且固定尺寸无法适配不同屏幕规格,你可以选择以下两种方式解决:
方案1:手动缩放图片(推荐)
这种方式适配精度更高,可灵活根据屏幕尺寸比例设置Marker大小:
- 先导入依赖包
import 'dart:ui' as ui; import 'package:flutter/services.dart';
- 新增自定义缩放工具方法
Future<BitmapDescriptor> getResizedMarker(String assetPath, double targetWidth) async { ByteData data = await rootBundle.load(assetPath); ui.Codec codec = await ui.instantiateImageCodec( data.buffer.asUint8List(), targetWidth: targetWidth.round(), ); ui.FrameInfo fi = await codec.getNextFrame(); final byteData = await fi.image.toByteData(format: ui.ImageByteFormat.png); final Uint8List imageBytes = byteData!.buffer.asUint8List(); return BitmapDescriptor.fromBytes(imageBytes); }
- 修改初始化逻辑,将原
initState中的图标初始化逻辑移到didChangeDependencies中,适配屏幕尺寸:
@override void didChangeDependencies() { super.didChangeDependencies(); final queryData = MediaQuery.of(context); // 按屏幕宽度比例设置Marker宽度,比如占屏幕宽度的8%,可自行调整比例 final targetMarkerWidth = queryData.size.width * 0.08; getResizedMarker('images/MareaBlancFondBlanc.png', targetMarkerWidth) .then((value) { setState(() { iconMareaEstLa = value; // 图标加载完成后添加Marker,避免出现默认图标闪烁 _listMk.add( Marker( markerId: const MarkerId('MKIDPOSMAREA'), draggable: false, icon: iconMareaEstLa, position: LatLng(posMareaLat,posMareaLng), ) ); }); }); }
- 删除原
_onMapCreated中添加Marker的逻辑,避免重复添加。
方案2:修改原有fromAssetImage配置
如果不想新增工具方法,可给ImageConfiguration补充设备像素比参数适配分辨率:
@override void didChangeDependencies() { super.didChangeDependencies(); final queryData = MediaQuery.of(context); BitmapDescriptor .fromAssetImage( ImageConfiguration( size: const Size(50,50), // 补充设备像素比参数 devicePixelRatio: queryData.devicePixelRatio, ), 'images/MareaBlancFondBlanc.png') .then((value) => iconMareaEstLa = value); }
注意:该方案适配效果不如方案1稳定,不同设备可能出现尺寸偏差
内容的提问来源于stack exchange,提问作者yvan Coyaud
相关产品推荐
相关产品推荐

