尝试使用自定义渲染器在地图上显示圆圈。 (机器人)
将Xamarin.Forms.Maps更新为v2.3.3.175,现在我收到错误:CustomMapRenderer.OnElementChanged(ElementChangedEventArgs)':找不到合适的方法来覆盖。
以前没有遇到任何问题。即使是下面链接的样本也不再有效。 https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/maps/map-overlay/circle/
将ElementChangedEventArgs<View>
更改为ElementChangedEventArgs<Map>
会解决错误,但永远不会调用渲染器,因此圈子永远不会显示。
有什么想法吗?提前谢谢。
我的自定义Android渲染器:
using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using Xamarin.Forms;
using Xamarin.Forms.Maps.Android;
using GasFinder;
using MapOverlay.Droid;
[assembly: ExportRenderer(typeof(CustomMap),typeof(CustomMapRenderer))]
namespace MapOverlay.Droid {
public class CustomMapRenderer:MapRenderer, IOnMapReadyCallback {
GoogleMap map;
CustomCircle circle;
protected override void OnElementChanged(Xamarin.Forms.Platform.Android.ElementChangedEventArgs<View> e) {
base.OnElementChanged(e);
if(e.OldElement != null) {
// Unsubscribe
}
if(e.NewElement != null) {
var formsMap = (CustomMap)e.NewElement;
circle = formsMap.Circle;
((MapView)Control).GetMapAsync(this);
}
}
public void OnMapReady(GoogleMap googleMap) {
map = googleMap;
var circleOptions = new CircleOptions();
circleOptions.InvokeCenter(new LatLng(circle.Position.Latitude,circle.Position.Longitude));
circleOptions.InvokeRadius(circle.Radius);
circleOptions.InvokeFillColor(0X233273b1);
circleOptions.InvokeStrokeColor(0X64007eff);
circleOptions.InvokeStrokeWidth(10);
map.AddCircle(circleOptions);
}
}
}
CustomMap.cs如下:
using System.Collections.Generic;
using Xamarin.Forms.Maps;
namespace GasFinder {
public class CustomMap:Map {
public CustomCircle Circle { get; set; }
}
}
CustomCircle.cs如下:
using Xamarin.Forms.Maps;
namespace GasFinder {
public class CustomCircle {
public Position Position { get; set; }
public double Radius { get; set; }
}
}
我的Page.xaml.cs上的代码如下:
var position = new Xamarin.Forms.Maps.Position(Search.loc.lat,Search.loc.lng);
customMap.Circle = new CustomCircle {
Position = position,
Radius = Settings.Distance*1000
};
答案 0 :(得分:0)
使用Xamarin.Forms.Maps v2.3.3.193
protected override void OnElementChanged(ElementChangedEventArgs<Map> e) {
base.OnElementChanged(e);
if(e.OldElement != null) { }
if(e.NewElement != null) {
var formsMap = (CustomMap)e.NewElement;
circle = formsMap.Circle;
((MapView)Control).GetMapAsync(this);
}
}