Xamarin GoogleMaps - 可接受的针脚/标记颜色

时间:2017-11-27 16:31:53

标签: c# google-maps xamarin google-maps-api-3 xamarin.forms

我在便携式项目中使用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”,但是它抛出了一个错误,至少对我而言。(也许我做错了。它告诉图像需要是一个位图)

如果可能的话,我想避免使用自定义渲染器,因为现在它没有任何自定义渲染(除了我说的一些颜色)之外它工作得很好。

1 个答案:

答案 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值的字符串属性。

查看具有自定义颜色的地图的示例图像。

enter image description here