在Google地图上绘制文本不再可能吗?

6

我正在将一个Android应用程序从版本1升级到版本2的android谷歌地图API。在我的版本1代码中,我能够通过重写draw()方法,在我的ItemizedOverlay子类中直接在地图上绘制文本,如下所示。我想要绘制的文本是动态的,是我想要显示在每个地图标记旁边的附加文本项,因此随着不同的符号被绘制/删除,文本将被频繁添加/删除。

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

然而,在API的第二个版本中似乎不可能这样做。没有ItemizedOverlays概念,也无法进行子类化。是否有一些方法可以在新版API中在GoogleMap上绘制文本?


1
你看过GroundOverlayTileOverlay了吗? - CommonsWare
我已经查看了类的描述。它们似乎是用于覆盖静态图像,而不是我正在寻找的目的。 - Stealth Rabbi
可能是真的,但我怀疑你要么会找到一种方法使其中一个起作用,要么就没办法了。 - CommonsWare
2个回答

5

我也遇到了同样的问题,想从v1升级到v2。最终我使用了一个标记,创建了一个带有文本的位图,并将其用作标记的图标。

首先,您需要使用文本创建位图。 注意:使用text属性(颜色,字体,文本对齐等)配置paintText

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

然后,请使用Canvas来绘制文本。使用Canvas在调整文本大小时可能会有些疯狂。

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

最后使用Bitmap在MarkerOption中创建图标。
MarkerOptions markerOptions = new MarkerOptions()
    .position(latlngMarker)
    .icon(BitmapDescriptorFactory.fromBitmap(bmpText))
    .anchor(0.5f, 1);

希望能对您有所帮助。


谢谢!完美地运作了。只是需要注意的是:第二个块中的 canvasText.getHeight(), paintNameBackground); 这一行是错误的——复制/粘贴出了问题?不管怎样,我不知道它的目的是什么,但没有这行也能正常运行。 - psycho
1
@jgonza73,“paintText”实例是哪个类?你如何创建它? - Adam Varhegyi
@jgonza73 这里的 paintText 变量是什么? - Ankesh kumar Jaisansaria

4
您可以使用以下代码从视图创建标记(Marker):
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;
}

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

编辑:如果您使用多个标记,请确保不要为每个标记执行DisplayMetrics和视图设置(位于Bitmap bitmap = .....之上的所有内容)。这将极大地减慢您的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接