MyLocationOverlay - Imagine personalizată, dar fără umbră

Am o aplicație care utilizează o implementare personalizată a MyLocationOverlay .

În implementare am setat o proprietate bitmap care este utilizată atunci când a fost specificată, printr-o suprasarcină de Draw.

Funcționează frumos, utilizând imaginea mea personalizată, dar nu afișează o umbră - așa cum se face automat într-un ItemizedOverlay .

Poate cineva să ajute?

Aici este (codul relevant din) clasa mea:

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

    /// 
Uses the custom marker bitmap if one has been specified. Otherwise, the default is used.
    /// 
    /// 
    /// 
    /// 
    /// 
    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;
    }
}
0

2 răspunsuri

I think you're missing the point of the shadow argument. The map calls your draw() method twice and it tells you whether this is the shadow pass or not. It doesn't draw the shadow for you. So your code will look something like this:

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;
}
0
adăugat
Multumesc pentru clarificare. Deci, nu există nici o modalitate de a folosi o umbră auto-trasată ca în ItemizedOverlay?
adăugat autor manadart, sursa

Am înţeles. Puteți utiliza DrawAt pentru a desena umbra în mod automat.

Deci proprietatea mea devine Drawable thusly:

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

Iar suprascrierea arată acum:

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;
}

Funcționează perfect.

De asemenea, acest lucru respectă acum activarea busolei și va desena folosind tehnica implicită dacă nu este specificat Drawable .

0
adăugat
Am blogat despre aici , unde ați pot vedea implementarea completă personalizată a MyLocationOverlay .
adăugat autor manadart, sursa
Android dezvoltatori, România — Moldova
Android dezvoltatori, România — Moldova
27 participanți

Parteneri: ciupacabra.com, @php_ro, @js_ro, @node_ro iOS: @ro_ios Reguli: https://github.com/js-ro/it-telegram/blob/master/RULES.md