46

Khi tôi thêm một điểm đánh dấu từ một Bitmap tùy chỉnh, điểm đánh dấu không được căn giữa tại điểm tôi chỉ định.Đánh dấu bitmap định tâm (Google Maps API Android v2)

tôi thêm nó như thế này:

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

Đây là mã của 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; 
    } 
} 

và đây là fromDrawable phương pháp

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

tôi nên thêm gì mã của tôi để có được các dấu hiệu tập trung vào vị trí của họ?

Trả lời

132

Chỉ cần đặt điểm neo cho điểm đánh dấu là 0,5 và 0,5 (giữa biểu tượng).

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

Giá trị neo mặc định là (0.5f, 1.0f). Bạn có thể đọc khoảng marker here.

+1

Hoàn hảo .... đã lưu ngày của tôi –

+1

oh người đàn ông thần của tôi bạn là người tốt nhất –

+0

Bạn là người tiết kiệm cuộc sống –

7

Nếu bạn sử dụng Marker, bạn sẽ cần phải xác minh lại Anchor để căn giữa hình ảnh của bạn. Theo tài liệu nói: "Neo: Điểm trên hình ảnh sẽ được đặt ở vị trí LatLng của điểm đánh dấu. Giá trị mặc định là 50% từ bên trái của hình ảnh và ở cuối hình ảnh.".

Bạn có thể cân nhắc sử dụng GroundOverlay thay vì Marker nếu bạn muốn hình ảnh được căn giữa theo mặc định. Xem GroundOverlay, "Dấu vị trí theo mặc định 50% từ đầu hình ảnh và 50% từ bên trái của hình ảnh."

Các vấn đề liên quan