2015-05-11 167 views
7

我在地圖上使用多邊形,我想在它們上面有文本。有沒有可能的方法來做到這一點? 我試圖把簡單的文字放在地圖上,但沒有成功。在多邊形安卓上顯示文本谷歌地圖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? 
     } 

回答

5

您可以使用自定義圖標創建Marker,然後在該圖標上繪製文本。您可以使用這樣的方法:

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

您需要設置的位置標記的LatLng,你必須從你的Region(例如幾何形狀的第一點計算的話,最後一點,一個隨機點,質心,...)。

另外,考慮到繪製大量標記會對性能產生負面影響。

+0

謝謝你,這是真的很有幫助。 –

+0

不客氣。樂意效勞! – antonio

+1

@noni_methadoni如果此解決方案適合您,請接受此答案,以便其他人也可以使用此方法。 –

0

和C#/ Xamarin的版本,如果有人需要:

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