居中位图标记(Google Maps Android API v2)

Posted

技术标签:

【中文标题】居中位图标记(Google Maps Android API v2)【英文标题】:Centering bitmap Marker (Google Maps Android API v2) 【发布时间】:2013-03-22 07:06:30 【问题描述】:

当我从自定义位图添加标记时,标记不在我指定的点居中。

我是这样添加的:

    // 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)。 你可以阅读marker here。

【讨论】:

你是救命稻草【参考方案2】:

如果您使用Marker,则需要重新指定锚点以使图像居中。正如文档所说:“锚点:图像上将放置在标记的 LatLng 位置的点。默认为图像左侧和图像底部的 50%。”。

如果您希望图像默认居中,您可能应该考虑使用 GroundOverlay 而不是 Marker。参见GroundOverlay,“默认情况下,锚点距离图像顶部 50%,距离图像左侧 50%。”

【讨论】:

以上是关于居中位图标记(Google Maps Android API v2)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在特定标记 android-maps-utils 上对相机进行去簇和居中?

居中所有标记和折线谷歌地图插件颤振适合屏幕

iOS 中使用 nativescript-google-maps-sdk 的地图中心错误

google maps 单击标记点作为地图中心

如何使用 react-google-maps 显示多个标记

google maps js v3 api教程 -- 在地图上添加标记