2013-01-31 12 views
6

Uaktualniam aplikację na Androida z wersji 1 na wersję 2 Androida google maps API. W moim kodzie wersji 1 udało mi się narysować tekst bezpośrednio na mapie w mojej podklasie ItemizedOverlay przez przesłonięcie metody draw() w następujący sposób. Tekst, który chcę narysować, jest dynamiczny, dodatkowy element tekstowy, który chcę wyświetlić obok każdego znacznika mapy, aby tekst był często dodawany/usuwany, ponieważ różne symbole są drukowane/usuwane.Rysowanie tekstu na Google Map nie jest już możliwe?

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

Nie wydaje się to jednak możliwe w wersji 2 interfejsu API. To nie jest tak naprawdę koncepcja ItemizedOverlays i nic nie może zostać zklasyfikowane. Czy w jakiś sposób mogę narysować tekst w GoogleMap w nowej wersji API?

+1

Czy spojrzałeś na 'GroundOverlay' i' TileOverlay'? – CommonsWare

+0

Przyjrzałem się opisom zajęć. Wydają się być przeznaczone do nakładania obrazów statycznych, a nie do celu, którego szukam. –

+0

To może być prawda, ale podejrzewam, że albo znajdziesz sposób na wykonanie jednej z tych prac, albo nie masz szczęścia. – CommonsWare

Odpowiedz

3

Miałem ten sam problem, próbując uaktualnić wersję od wersji 1 do wersji 2. W końcu użyłem markera, stworzyłem bitmapę z tekstem i użyłem jej jako ikony znacznika.

Przede wszystkim musisz utworzyć de Bitmap z tekstem. Uwaga: skonfigurowanie paintText o właściwościach tekstowych (kolor, krój, 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); 

Następnie użyj Canvas do rysowania tekstu. To trochę szaleństwo, popraw tekst z płótnowymi wymiarami.

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

Wreszcie użyć Bitmap stworzyć ikonę w MarkerOption

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

Nadzieja to może pomóc.

+0

Dzięki! To doskonale działa. Tylko uwaga: wiersz 'canvasText.getHeight(), paintNameBackground);' (blok 2d) jest nieprawidłowy - złe kopiowanie/wklejanie? W każdym razie nie wiem, jaki był jego cel, ale bez tego działa dobrze. – psycho

+0

Masz rację na @psycho, zmieniłem to, dzięki! – jgonza73

+1

@ jgonza73 Jaką klasą jest instancja "paintText"? Jak to robisz? –

4

Można utworzyć znacznik z widoku za pomocą następującego kodu:

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

Źródło: http://www.nasc.fr/android/android-using-layout-as-custom-marker-on-google-map-api/

edit: Jeśli używasz więcej niż jednego markera, upewnij się, że nie robią DisplayMetrics i przeglądaj ustawienia (wszystko powyżej bitmapy bitmap = .....) dla każdego znacznika. To drastycznie spowolniłoby Twoją aplikację.

+2

Próbowałem tego rozwiązania, ale jest bardzo powolne! – GeniDeveloper

Powiązane problemy