2015-05-11 20 views
7

Używam wielokątów na mapie i chcę mieć na nich tekst. Czy jest jakiś sposób to zrobić? Próbowałem umieścić prosty tekst na punkcie mapy, ale go nie osiągnąłem.Pokaż tekst na temat wielokątów android Google map v2

private void addPolygon(Region reg) { 
      PolylineOptions polylineOptions = new PolylineOptions(); 
      ArrayList<LatLng> coordList=reg.getAllPoints(); 
      coordList.add(coordList.get(0)); 
      int regColor = reg.getColor(); 
      String regName = reg.getName(); 
      //want to put a name on region 
      polylineOptions.addAll(coordList); 
      polylineOptions 
       .width(5) 
       .color(Color.BLACK); 
      if (regColor != 0) 
       polylineOptions 
        .color(regColor); 
      map.addPolyline(polylineOptions); 
      //text on shape? 
     } 

Odpowiedz

5

Możesz utworzyć Marker z niestandardową ikoną i narysować tekst na tej ikonie. Można użyć metody takie jak to:

public Marker addText(final Context context, final GoogleMap map, 
     final LatLng location, final String text, final int padding, 
     final int fontSize) { 
    Marker marker = null; 

    if (context == null || map == null || location == null || text == null 
      || fontSize <= 0) { 
     return marker; 
    } 

    final TextView textView = new TextView(context); 
    textView.setText(text); 
    textView.setTextSize(fontSize); 

    final Paint paintText = textView.getPaint(); 

    final Rect boundsText = new Rect(); 
    paintText.getTextBounds(text, 0, textView.length(), boundsText); 
    paintText.setTextAlign(Align.CENTER); 

    final Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
    final Bitmap bmpText = Bitmap.createBitmap(boundsText.width() + 2 
      * padding, boundsText.height() + 2 * padding, conf); 

    final Canvas canvasText = new Canvas(bmpText); 
    paintText.setColor(Color.BLACK); 

    canvasText.drawText(text, canvasText.getWidth()/2, 
      canvasText.getHeight() - padding - boundsText.bottom, paintText); 

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

    marker = map.addMarker(markerOptions); 

    return marker; 
} 

Będziesz musiał ustawić lokalizację LatLng markera i trzeba będzie go obliczyć z Region (na przykład pierwszego punktu geometrii, ostatni punkt, losowy punkt, środek ciężkości, ...).

Należy również wziąć pod uwagę, że losowanie znaczników będzie miało negatywny wpływ na wydajność.

+0

Dziękuję, że był bardzo pomocny. –

+0

Nie ma za co. Miło, że mogłem pomóc! – antonio

+1

@noni_methadoni, jeśli to rozwiązanie zadziałało dla Ciebie, zaakceptuj tę odpowiedź, aby inni również mogli skorzystać z tej metody. –

0

i C# wersja/Xamarin jeśli ktoś potrzebuje:

public Marker AddText(Context context, GoogleMap map, LatLng location, string text, int fontSize) 
{ 
    if (text == null) 
     throw new ArgumentNullException(nameof(text)); 
    if (location == null) 
     throw new ArgumentNullException(nameof(location)); 
    if (map == null) 
     throw new ArgumentNullException(nameof(map)); 
    if (context == null) 
     throw new ArgumentNullException(nameof(context)); 
    if (fontSize <= 0) 
     throw new ArgumentOutOfRangeException(nameof(fontSize)); 

    var textView = new TextView(context); 
    textView.Text = text; 
    textView.TextSize = fontSize; 
    var paintText = textView.Paint; 
    var boundsText = new Rect(); 
    paintText.GetTextBounds(text, 0, textView.Length(), boundsText); 
    paintText.TextAlign = Paint.Align.Center; 
    paintText.Color = Android.Graphics.Color.Black; 
    var bmpText = Bitmap.CreateBitmap(boundsText.Width(), boundsText.Height(), Bitmap.Config.Argb8888); 
    var canvasText = new Canvas(bmpText); 
    canvasText.DrawText(text, canvasText.Width/2, canvasText.Height - boundsText.Bottom, paintText); 
    return map.AddMarker((new MarkerOptions().SetPosition(location).SetIcon(BitmapDescriptorFactory.FromBitmap(bmpText)).Anchor(0.5f, 1))); 
} 
Powiązane problemy