Центрирование растрового маркера (API Android Google Maps v2)
Когда я добавляю маркер из пользовательского растрового изображения, маркер не центрируется в указанной точке.
Я добавляю его вот так:
// 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));
}
Это код 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;
}
}
и здесь fromDrawable
метод
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;
}
Что я должен добавить в свой код, чтобы получить маркеры с центрами в их позициях?
Ответы
Ответ 1
Просто установите опорную точку для маркера в 0.5 и 0.5 (середина вашего значка).
...
MarkerOptions m = new MarkerOptions();
m.anchor(0.5f, 0.5f);
...
Значение привязки по умолчанию равно (0.5f, 1.0f).
Вы можете прочитать здесь маркер.
Ответ 2
Если вы используете Marker, вам нужно будет отремонтировать якорь, чтобы центрировать изображение. Как говорится в документации: "Якорь: точка на изображении, которая будет помещена в позицию LatLng маркера. Это значение по умолчанию составляет 50% слева от изображения и внизу изображения".
Возможно, вам стоит подумать об использовании GroundOverlay вместо Marker, если вы хотите, чтобы изображение было по центру по центру. См. GroundOverlay. "Якорь по умолчанию - 50% от верхней части изображения и 50% слева от изображения".