如何在Delphi 10.4.2的MapView组件Marker标记上添加显示文本?
Delphi 10.4.2 MapView标记添加文本解决方案
问题原因说明
TMapMarker的Snippet属性默认不会直接显示在标记表面,它是点击标记后弹出的信息窗口(InfoWindow)的副标题内容。你的代码首先存在构造函数语法错误,也没有触发信息窗口显示,所以看不到设置的内容。
场景1:需要文本显示在点击标记弹出的信息窗口中
先修正代码语法,添加标记后可主动调用ShowInfoWindow方法直接弹出信息窗口,无需用户点击:
var MapCenter: TMapCoordinate; desqr: TMapMarkerDescriptor; LMarker: TMapMarker; begin MapCenter := TMapCoordinate.Create(latitude, longitude); // 修正构造函数多余逗号的语法错误,第二个参数为信息窗口的标题 desqr := TMapMarkerDescriptor.Create(MapCenter, '标记标题'); desqr.Snippet := myVariable; desqr.Draggable := True; // 接收AddMarker返回的标记实例 LMarker := MapView1.AddMarker(desqr); // 主动弹出信息窗口,直接显示标题和Snippet内容 LMarker.ShowInfoWindow; MapView1.Location := MapCenter; MapView1.Zoom := 10; end;
安卓端兼容提示
10.4.2版本MapView在安卓平台存在信息窗口不刷新的已知bug,如果赋值后点击仍不显示Snippet,可在赋值Snippet后追加如下代码触发刷新:
var tmpTitle := desqr.Title; desqr.Title := ''; desqr.Title := tmpTitle;
场景2:需要文本直接固定显示在标记上,无需点击
原生MapView没有提供直接设置标记旁文本的属性,需要自定义绘制带文本的标记图标,再赋值给标记的Icon属性:
// 生成带文本的自定义标记图标 procedure TForm1.CreateMarkerIconWithText(const AText: string; out AIcon: TBitmap); begin AIcon := TBitmap.Create; try // 可替换为自己的标记图标资源 AIcon.LoadFromResourceName(HInstance, 'DEFAULT_MARKER'); AIcon.Canvas.Font.Size := 12; AIcon.Canvas.Font.Color := TAlphaColors.Black; // 文本居中绘制在标记下方 var LTextWidth := AIcon.Canvas.TextWidth(AText); AIcon.Canvas.TextOut((AIcon.Width - LTextWidth) div 2, AIcon.Height + 3, AText); except AIcon.Free; raise; end; end; // 调用示例 var LCustomIcon: TBitmap; begin MapCenter := TMapCoordinate.Create(latitude, longitude); CreateMarkerIconWithText(myVariable, LCustomIcon); try desqr := TMapMarkerDescriptor.Create(MapCenter, '标记标题'); desqr.Icon := LCustomIcon; desqr.Draggable := True; MapView1.AddMarker(desqr); finally LCustomIcon.Free; end; end;
内容的提问来源于stack exchange,提问作者Kellouche AbdelHakim
相关产品推荐
相关产品推荐

