我有一个应用程序,它使用MyLocationOverlay的自定义实现。
在实现中,我设置了一个 Bitmap 属性,该属性在指定时通过 Draw 重载使用。
使用我的自定义图像,它工作得很好,但它不显示阴影 - 就像在逐项叠加中自动完成的那样。
谁能帮忙?
这是我的类(相关代码):
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;
}
}
我认为你错过了影子论点的重点。 地图调用 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;
}
知道了。您可以使用 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;
}
完美工作。
现在,这也考虑启用指南针,如果未指定可绘制对象,则将使用默认技术进行绘制。