0

我有一个应用程序,它使用MyLocationOverlay的自定义实现。

在实现中,我通过 Draw 的重载设置了一个在指定时使用的 Bitmap 属性。

它使用我的自定义图像效果很好,但它不显示阴影- 正如在ItemizedOverlay中自动完成的那样。

任何人都可以帮忙吗?

这是我的班级(相关代码):

public class LocationOverlay: MyLocationOverlay
{
    /// <summary>Bitmap to use for indicating the current fixed location.</summary>
    public Bitmap LocationMarker { get; set; }

    /// <summary>Uses the custom marker bitmap if one has been specified. Otherwise, the default is used.</summary>
    /// <param name="canvas"></param>
    /// <param name="mapView"></param>
    /// <param name="shadow"></param>
    /// <param name="when"></param>
    /// <returns></returns>
    public override bool Draw(Canvas canvas, MapView mapView, bool shadow, long when)
    {
        var drawShadow = shadow;

        if (LocationMarker != null && LastFix != null)
        {
            var screenPoint = new Point();
            var geoPoint = new GeoPoint((int)(LastFix.Latitude * 1E6), (int)(LastFix.Longitude * 1E6));
            mapView.Projection.ToPixels(geoPoint, screenPoint);
            canvas.DrawBitmap(LocationMarker, screenPoint.X, screenPoint.Y - 32, null);
            drawShadow = true;
        }

        base.Draw(canvas, mapView, drawShadow);
        return true;
    }
}
4

2 回答 2

2

我认为你错过了影子论点的重点。地图两次调用您的 draw() 方法,它会告诉您这是否是阴影通道。它不会为你画阴影。所以你的代码看起来像这样:

public override bool Draw(Canvas canvas, MapView mapView, bool shadow, long when)
{
    if (LocationMarker != null && LastFix != null)
    {
        var screenPoint = new Point();
        var geoPoint = new GeoPoint((int)(LastFix.Latitude * 1E6), (int)(LastFix.Longitude * 1E6));
        mapView.Projection.ToPixels(geoPoint, screenPoint);

        if(shadow)
        {
            // Draw your shadow bitmap here
        }
        else
        {
            canvas.DrawBitmap(LocationMarker, screenPoint.X, screenPoint.Y - 32, null);
        }
    }

    return true;
}
于 2012-06-04T20:05:53.987 回答
1

知道了。您可以使用DrawAt自动绘制阴影。

所以我的财产就这样变成了可绘制的:

public Drawable MarkerResource
{
    set
    {
        _locationMarker = value;
        var widthOffset = _locationMarker.IntrinsicWidth / 2;
        _locationMarker.SetBounds(-widthOffset, -_locationMarker.IntrinsicHeight, widthOffset, 0);
    }
}

覆盖现在看起来像这样:

public override bool Draw(Canvas canvas, MapView mapView, bool shadow, long when)
{
    if (LastFix == null) return false;

    if (_locationMarker != null)
    {
        var screenPoint = new Point();
        var geoPoint = new GeoPoint((int)(LastFix.Latitude * 1E6), (int)(LastFix.Longitude * 1E6));
        mapView.Projection.ToPixels(geoPoint, screenPoint);
        DrawAt(canvas, _locationMarker, screenPoint.X, screenPoint.Y, shadow);
    }
    else if (MyLocation != null) DrawMyLocation(canvas, mapView, LastFix, MyLocation, when);

    if (IsCompassEnabled) DrawCompass(canvas, Orientation);
    return false;
}

完美运行。

现在,这也尊重启用指南针,如果未指定Drawable,将使用默认技术进行绘制。

于 2012-06-05T09:19:32.663 回答