Zentrieren der Bitmap-Markierung (Google Maps Android API v2)

Lesezeit: 3 Minuten

Wenn ich eine Markierung aus einer benutzerdefinierten Bitmap hinzufüge, wird die Markierung nicht an dem von mir angegebenen Punkt zentriert.

Ich füge es so hinzu:

    // ID tramo
    final int tramoId = tr.getId();
    // Nodos
    final Nodo[] nodos = tr.getNodos();

    final PolylineOptions p = new PolylineOptions();
    MarkerOptions m = new MarkerOptions();
    // Seteamos posicion de linea y marker
    m.position(semisuma(nodos));
    for (final Nodo n : nodos) {
        p.add(n.getLatLng());
    }
    // Color de linea y marker
    BitmapDescriptor icon = null;
    if (tr.getCapacidad() == 0) {
        p.color(0xFF000000);
        m = null;
    } else if (tr.getCapacidad() - tr.getPlazasOcupadas() == 0) {
        p.color(0xEEFF0000);
        final TextDrawable drawable = new TextDrawable(0, 0xEEFF0000,
                0xFFFFFFFF);
        icon = BitmapDescriptorFactory.fromBitmap(fromDrawable(drawable));
    } else {
        p.color(0xEE00FFFF);
        final TextDrawable drawable = new TextDrawable(0, 0xEE00FFFF,
                0xFFFFFFFF);
        icon = BitmapDescriptorFactory.fromBitmap(fromDrawable(drawable));
    }
    if (m != null) {
        m.title(String.valueOf(tramoId));
        m.icon(icon);
    }
    if (polylinesTramo.get(idTramo) != null) {
        polylinesTramo.get(idTramo).remove();
    }
    if (markersTramo.get(idTramo) != null) {
        markersTramo.get(idTramo).remove();
    }
    polylinesTramo.put(idTramo, map.getMap().addPolyline(p));
    if (marker != null) {
        markersTramo.put(idTramo, map.getMap().addMarker(m));
    }

Dies ist der Code von TextDrawable:

package com.cidaut.blueparking.ui;

import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;

public class TextDrawable extends Drawable {

    private final String text;
    private final Paint paint;
    private final int centroX = 13;
    private final int centroY = 16;
    private final float textSize;
    private final float whereToDrawX;
    private final int bgColor;

    public TextDrawable(final int text, final int bgColor, final int textColor) {
        this(String.valueOf(text), bgColor, textColor);
    }

    public TextDrawable(final String text, final int bgColor, final int textColor) {
        this.text = text;
        this.bgColor = bgColor;
        this.paint = new Paint();
        paint.setColor(textColor);
        paint.setTextSize(14f);
        paint.setAntiAlias(true);
        paint.setFakeBoldText(true);
        paint.setStyle(Paint.Style.FILL);
        paint.setTextAlign(Paint.Align.LEFT);
        textSize = paint.measureText(text);
        whereToDrawX = centroX - (textSize / 2);
    }

    @Override
    public void draw(final Canvas canvas) {
        canvas.drawColor(bgColor);
        canvas.drawText(text, whereToDrawX, centroY, paint);
    }

    @Override
    public void setAlpha(final int alpha) {
        paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(final ColorFilter cf) {
        paint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

und hier ist die fromDrawable Methode

protected Bitmap fromDrawable(final Drawable drawable) {
    final Bitmap bitmap = Bitmap.createBitmap(25, 25, Config.ARGB_8888);
    final Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

Was sollte ich meinem Code hinzufügen, um die Markierungen an ihren Positionen zu zentrieren?

Benutzer-Avatar
stevo.mit

Setzen Sie einfach den Ankerpunkt für Ihre Markierung auf 0,5 und 0,5 (Mitte Ihres Symbols).

...
MarkerOptions m = new MarkerOptions();
m.anchor(0.5f, 0.5f);
...

Der Standardankerwert ist (0.5f, 1.0f). Sie können darüber lesen Markierung hier.

  • Du bist ein Lebensretter

    – Emre Koc

    14. April 2017 um 8:25 Uhr

Wenn du benutzt Marker Sie müssen den Anker neu spezifizieren, um Ihr Bild zu zentrieren. Wie die Dokumentation sagt: “Anker: Der Punkt auf dem Bild, der an der LatLng-Position der Markierung platziert wird. Dies ist standardmäßig 50% von der linken Seite des Bildes und am unteren Rand des Bildes.”.

Sie sollten vielleicht GroundOverlay anstelle von Marker verwenden, wenn Sie möchten, dass das Bild standardmäßig zentriert wird. Sehen Bodenüberlagerung“Der Anker befindet sich standardmäßig 50 % vom oberen Bildrand und 50 % vom linken Bildrand. “

1176660cookie-checkZentrieren der Bitmap-Markierung (Google Maps Android API v2)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy