查找Xamarin.Android自定义地图标注可见时触发的GetViewForAnnotation等效方法
实现方案
等效方法说明
Android端Xamarin.Forms.Maps的CustomMapRenderer中,和iOS MapRenderer.GetViewForAnnotation 功能对应的实现分为两部分:
- 自定义信息窗口样式:使用
GoogleMap.IInfoWindowAdapter接口,重写GetInfoWindow(自定义整个信息窗口布局)或GetInfoContents(仅自定义窗口内容区域)即可实现和iOS端一致的标注视图自定义逻辑,方法会在信息窗口渲染前自动触发 - 标注可见时自动触发配置:在地图加载完成的
MapReady回调、或者标注添加完成的节点,即可对可见区域内的标注执行自定义配置,和iOS端标注变为可见时触发调用的逻辑对齐
默认展开信息窗口实现步骤
你可以直接通过以下代码实现无需点击自动展开信息窗口的需求:
- 在Android端的CustomMapRenderer中重写
OnMapReady方法,注册信息窗口适配器,同时遍历已添加的标注主动触发信息窗口展示
protected override void OnMapReady(GoogleMap googleMap) { base.OnMapReady(googleMap); // 注册自定义信息窗口适配器,对应iOS GetViewForAnnotation的自定义功能 googleMap.SetInfoWindowAdapter(new CustomInfoWindowAdapter(this)); // 遍历所有标注,默认展开第一个标注的信息窗口,可根据需求调整为你需要的标注 if (Element.Pins.Any()) { // 获取对应原生Marker对象 var firstPin = Element.Pins.First(); var marker = GetMarkerForPin(firstPin); // 主动调用展示信息窗口,无需用户点击 marker?.ShowInfoWindow(); } }
- 自定义信息窗口适配器示例
public class CustomInfoWindowAdapter : Java.Lang.Object, GoogleMap.IInfoWindowAdapter { private readonly CustomMapRenderer _renderer; public CustomInfoWindowAdapter(CustomMapRenderer renderer) { _renderer = renderer; } public Android.Views.View GetInfoWindow(Marker marker) { // 自定义整个信息窗口的布局,返回null则使用默认窗口框架,仅自定义内容走GetInfoContents return null; } public Android.Views.View GetInfoContents(Marker marker) { // 在这里自定义信息窗口的内容,和iOS GetViewForAnnotation的配置逻辑一致 var pin = _renderer.Element.Pins.FirstOrDefault(p => p.Label == marker.Title); if (pin == null) return null; // 加载自定义布局,配置内容 var view = LayoutInflater.From(_renderer.Context).Inflate(Resource.Layout.CustomInfoWindow, null); view.FindViewById<TextView>(Resource.Id.TitleText).Text = pin.Label; view.FindViewById<TextView>(Resource.Id.DescText).Text = pin.Address; return view; } }
内容的提问来源于stack exchange,提问作者Max951
相关产品推荐
相关产品推荐

