我在便携式项目中使用Xamarin.Forms.GoogleMaps。 它适用于iOS和Android。 现在我正在研究googleMap的pin / markers。 我正在尝试添加不同颜色的针脚,但并非所有颜色都有效。
我现在是怎么做的:
var pin = new Xamarin.Forms.GoogleMaps.Pin();
pin.Label = ... etc etc etc
pin.Icon = BitmapDescriptorFactory.DefaultMarker(Color.Azure);
上面的例子效果很好。但是,如果我将其更改为Color.Black
,则它不起作用并显示具有默认红色的标记。它也有不同平台的问题,在iOS,黑色作品,在Android中没有。 (不显示错误,只显示默认的红色而不是黑色)
所以我的问题是:
是否有可接受的颜色列表用作标记/引脚颜色?每种颜色都应该有效还是只有一些预定义的颜色?
另外,如何将默认图标更改为其他图标图像?我试过“FromBundle”,但是它抛出了一个错误,至少对我而言。(也许我做错了。它告诉图像需要是一个位图)
如果可能的话,我想避免使用自定义渲染器,因为现在它没有任何自定义渲染(除了我说的一些颜色)之外它工作得很好。
答案 0 :(得分:2)
如果您不想使用自定义渲染器,Xamarin Forms地图标记/引脚只能使用300种颜色。
但是如果你想像你希望的那样表示标记/引脚颜色,你需要实现Xamarin Forms Custom Renderers来实现/捕获你想要的确切标记/引脚颜色。
按照Xamarin Forms自定义渲染器文档中的步骤操作后,请覆盖以下方法:
protected override MarkerOptions CreateMarker(Pin pin)
{
CustomPin customPin = (CustomPin)pin;
var marker = new MarkerOptions();
marker.SetPosition(new LatLng(pin.Position.Latitude, pin.Position.Longitude));
marker.SetTitle(pin.Label);
marker.SetSnippet(pin.Address);
marker.SetIcon(GetCustomBitmapDescriptor(customPin.Color));
return marker;
}
然后我创建了以下方法,它将对RGB / Hex颜色代码中的标记/引脚颜色进行实际更改:
private BitmapDescriptor GetCustomBitmapDescriptor(string text)
{
using (Paint paint = new Paint(PaintFlags.AntiAlias))
{
using (Rect bounds = new Rect())
{
using (Bitmap baseBitmap = BitmapFactory.DecodeResource(Resources, Resource.Drawable.marker))
{
Bitmap resultBitmap = Bitmap.CreateBitmap(baseBitmap, 0, 0, baseBitmap.Width - 1, baseBitmap.Height - 1);
Paint p = new Paint();
ColorFilter filter = new PorterDuffColorFilter(Android.Graphics.Color.ParseColor(text), PorterDuff.Mode.SrcAtop);
p.SetColorFilter(filter);
Canvas canvas = new Canvas(resultBitmap);
canvas.DrawBitmap(resultBitmap, 0, 0, p);
Bitmap scaledImage = Bitmap.CreateScaledBitmap(resultBitmap, 94, 150, false);
BitmapDescriptor icon = BitmapDescriptorFactory.FromBitmap(scaledImage);
resultBitmap.Recycle();
return (icon);
}
}
}
}
注意:
此示例代码仅适用于Android。对iOS不确定。
Resource.Drawable.marker可以是您可以使用的任何标记。我刚刚在线下载了一个通用的红色地图标记。无论如何,它仍将被GetCustomBitmapDescriptor方法覆盖。
resultBitmap.Recycle();非常重要。因为位图占用大量内存而设备应用程序可能会停止,因此您需要重用位图内存。
CustomPin是一个扩展Xamarin.Forms.Map.Pin类的类。我为我的标记引脚添加了我想要的颜色的字符串Hex值的字符串属性。
查看具有自定义颜色的地图的示例图像。