2013-01-31 17 views
6

Sto aggiornando un'applicazione Android dalla versione 1 alla versione 2 dell'API Android google maps. Nel mio codice versione 1, ero in grado di disegnare il testo direttamente sulla mappa nella sottoclasse di ItemizedOverlay sovrascrivendo il metodo draw(), come segue. Il testo che voglio disegnare è dinamico, un elemento di testo aggiuntivo che desidero visualizzare accanto a ciascun indicatore di mappa, quindi il testo verrà aggiunto/rimosso di frequente quando i simboli vengono tracciati/rimossi.Disegnare testo su Google Map non è più possibile?

@Override 
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
     long when) { 
    if (!shadow) {    
      canvas.drawText("some text", (float) point.x + TextOffsetX , (float) point.y + TextOffsetY, m_paint); 
    } 


    return super.draw(canvas, mapView, shadow, when); 
} 

Tuttavia, questo non sembra possibile nella versione 2 dell'API. Questo non è in realtà un concetto di ItemizedOverlays e nulla può essere sottoclassato. C'è un modo per disegnare il testo su GoogleMap nella nuova versione dell'API?

+1

Hai guardato "GroundOverlay' e' TileOverlay'? – CommonsWare

+0

Ho esaminato le descrizioni delle classi. Sembra che siano pensati per sovrapporre immagini statiche e non per lo scopo che sto cercando. –

+0

Potrebbe essere vero, ma sospetto che o troverai un modo per fare uno di quei lavori, o sei sfortunato. – CommonsWare

risposta

3

Ho avuto lo stesso problema, provando ad aggiornare da v1 a v2. Finalmente ho usato un pennarello, ho creato una bitmap con il testo e l'ho usata come icona del marcatore.

Prima di tutto, devi creare de Bitmap con il testo. Nota: configurare paintText con le proprietà di testo (colore, carattere tipografico, textAlign, ...)

Rect boundsText = new Rect(); 
paintText.getTextBounds(strText, 0, strText.length(), boundsText); 
Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
Bitmap bmpText = Bitmap.createBitmap(boundsText.width(), boundsText.height(), conf); 

Poi, Usa tela per disegnare il testo. È un po 'pazzo correggere il testo con la dimensione della tela.

Canvas canvasText = new Canvas(bmpText); 
canvasText.drawText(strText, canvasText.getWidth()/2, canvasText.getHeight(), paintText); 

utilizzare Infine Bitmap per creare un'icona in MarkerOption

MarkerOptions markerOptions = new MarkerOptions() 
    .position(latlngMarker) 
    .icon(BitmapDescriptorFactory.fromBitmap(bmpText)) 
    .anchor(0.5f, 1); 

Spero che potrebbe aiutare.

+0

Grazie! Funziona perfettamente. Solo una nota: la riga 'canvasText.getHeight(), paintNameBackground);' (blocco 2d) è sbagliata - copia/incolla male? Ad ogni modo, non so quale fosse il suo scopo ma funziona senza. – psycho

+0

Avevi ragione @psycho, l'ho cambiato, grazie! – jgonza73

+1

@ jgonza73 Quale classe è l'istanza "paintText"? Come lo fai? –

4

È possibile creare un marcatore da una vista utilizzando il seguente codice:

public static Bitmap createDrawableFromView(Context context, View view) { 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels); 
    view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); 
    view.buildDrawingCache(); 
    Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

    Canvas canvas = new Canvas(bitmap); 
    view.draw(canvas); 

    return bitmap; 
} 

Fonte: http://www.nasc.fr/android/android-using-layout-as-custom-marker-on-google-map-api/

Edit: Se si utilizza più di un singolo marcatore, assicuratevi di non fare il DisplayMetrics e visualizza il materiale di configurazione (tutto sopra Bitmap bitmap = .....) per ogni marker. Ciò rallenterebbe notevolmente la tua app.

+2

Ho provato questa soluzione ma è molto lento! – GeniDeveloper

Problemi correlati