具有自定义标记的android Maps API v2

我想制作自定义标记的地图。 在API v2中,我可以设置标记的图标,标题等。 但是我想在第一次启动时用标记显示标题。 现在标题只有在录制标记时才会显示。 在v1是叠加,但在v2我没有发现任何类似的东西。

编辑:也许我不够清楚。 像API中的Marker.showInfoWindow()只能用于一个标记。 我无法同时显示所有标记的信息窗口。 无论如何,我需要显示所有标记的标题,而无需等待用户点击它。

我也偶然发现了这个问题。 V2 API是向前迈出的两步。 谷歌,请在标记或GoogleMap类上添加可覆盖的“绘制”方法,以便我们可以自定义绘图。

一个可能的解决scheme是即时生成位图并将其附加到标记。 即创build一个canvas,插入标记位图,在标记旁边绘制文本。 这涉及到一些痛苦的计算(适当的canvas大小与标记位图和文本相邻)。 不幸的是,Marker中没有setIcon方法,所以每次文本改变时,都必须创build一个新的标记。 如果你在地图上只有一个标记,但是有几十个标记,这可能没有问题。 此外,dynamic创build这些位图可能会有内存问题。 示例代码(仅包含文本):

 Bitmap.Config conf = Bitmap.Config.ARGB_8888; Bitmap bmp = Bitmap.createBitmap(200, 50, conf); Canvas canvas = new Canvas(bmp); canvas.drawText("TEXT", 0, 50, paint); // paint defines the text color, stroke width, size mMap.addMarker(new MarkerOptions() .position(clickedPosition) //.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2)) .icon(BitmapDescriptorFactory.fromBitmap(bmp)) .anchor(0.5f, 1) ); 

希望Google能够添加适当的方法,以便我们可以轻松完成。 该死,我真的很喜欢V2 API中的新的地图旋转function。

终于做到了。 所以你所做的是有一个背景图像(在我的情况下,我只是使用蓝色的矩形)。 像这样创build一个标记:

 Marker myLocMarker = map.addMarker(new MarkerOptions() .position(myLocation) .icon(BitmapDescriptorFactory.fromBitmap(writeTextOnDrawable(R.drawable.bluebox, "your text goes here")))); 

注意writeTextOnDrawable()方法:

 private Bitmap writeTextOnDrawable(int drawableId, String text) { Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId) .copy(Bitmap.Config.ARGB_8888, true); Typeface tf = Typeface.create("Helvetica", Typeface.BOLD); Paint paint = new Paint(); paint.setStyle(Style.FILL); paint.setColor(Color.WHITE); paint.setTypeface(tf); paint.setTextAlign(Align.CENTER); paint.setTextSize(convertToPixels(context, 11)); Rect textRect = new Rect(); paint.getTextBounds(text, 0, text.length(), textRect); Canvas canvas = new Canvas(bm); //If the text is bigger than the canvas , reduce the font size if(textRect.width() >= (canvas.getWidth() - 4)) //the padding on either sides is considered as 4, so as to appropriately fit in the text paint.setTextSize(convertToPixels(context, 7)); //Scaling needs to be used for different dpi's //Calculate the positions int xPos = (canvas.getWidth() / 2) - 2; //-2 is for regulating the x position offset //"- ((paint.descent() + paint.ascent()) / 2)" is the distance from the baseline to the center. int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ; canvas.drawText(text, xPos, yPos, paint); return bm; } public static int convertToPixels(Context context, int nDP) { final float conversionScale = context.getResources().getDisplayMetrics().density; return (int) ((nDP * conversionScale) + 0.5f) ; } 

感谢Arun George: 以编程方式在android中添加文本到图像

好像你的问题最终在Google I / O会话中得到了回答。

看看http://googlemaps.github.io/android-maps-utils/

它有:

标记群集 – 处理大量点的显示

热图 – 显示大量点作为热图

IconGenerator – 在你的标记上显示文字(见截图)

使用图书馆制作的标记

非常重要的是它可以任何线程上进行修改,所以处理多个标记是一件轻而易举的事情

我不知道你试图达到的目标是什么:显示信息窗口,用户不必点击标记,或者使用信息窗口的完全不同的视图(或者两者)。

要显示信息窗口而不需要用户点击:

我自己没有testing过,但我猜Marker.showInfoWindow()会做的伎俩(假设标记的可见性已经是true

为InfoWindow提供自定义视图

这里有两个选项,你应该参考GoogleMap.InfoWindowAdapter的文档:

公共静态接口GoogleMap.InfoWindowAdapter

提供信息窗口自定义渲染的视图。

不pipe是什么原因(用户手势或对showInfoWindow())的编程调用,都会调用此提供程序上的方法,因为在任何时候只显示一个信息窗口,这个提供者可以select重用视图,也可以select在每个方法调用上创build新的视图。

构build信息窗口时,将按照定义的顺序调用此类中的方法。 要replace默认的信息窗口,请用您的自定义渲染重写getInfoWindow(Marker)。 要只replace默认信息窗口框架(标注泡泡)内的信息窗口内容,请保留getInfoWindow(标记)的默认实现,并覆盖getInfoContents(标记)。

基本上,您是否重写getInfoWindow()getInfoContents()将取决于您是否只想定制您在标注泡泡内看到的内容,或者是否希望自定义整个信息窗口视图,包括标注泡泡的替代scheme。

一个警告:我相信当你重写这些方法时,它执行getInfoWindow()getInfoContents()被调用时的视图看起来像一个简单的呈现。 我自己有兴趣尝试复制本地Google地图Android应用程序的外观,该地图名称旁边有一个“方向”图标。 我相信的其中一个问题(请参阅https://stackoverflow.com/a/13713536/129475 )是,如果在视图中有类似button的内容,则由于静态呈现,它可能不像button那样工作。

自定义标记图像

您可以使用自定义标记图像(通常称为图标)replace默认标记图像。 自定义图标始终设置为BitmapDescriptor,并使用BitmapDescriptorFactory类中的四种方法之一进行定义。

fromAsset(String assetName)使用资产目录中的图像创build自定义标记。

fromBitmap(位图图像​​)从位图图像创build自定义标记。

fromFile(String path)从指定path的文件创build自定义图标。

fromResource(int resourceId)使用现有资源创build自定义标记。 下面的代码片断创build一个带有自定义图标的标记。

  private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962); private Marker melbourne = mMap.addMarker(new MarkerOptions() .position(MELBOURNE) .title("Melbourne") .snippet("Population: 4,137,400") .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))); 

这个简单的代码可以在不需要点击事件的情况下显示标题:

 googleMap.addMarker(new MarkerOptions() .position(latLng) .title(String title)) .showInfoWindow(); 

为什么不保留标记数组,然后当涉及标记时,通过调用showInfoWindow()遍历它们。 可能不是最优雅的解决scheme,但它的确如你所说,我想。

我用图片编辑器制作了自己的标记,下面详细解释了这个问题。 它花了一些时间,但它的工作。

我用Photoshop和53x110px标记。

我做的一个例子标记