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

jum*_*r0k 65 android google-maps google-maps-android-api-2

我想用自定义标记制作地图.在API v2中,我可以为标记设置图标,标题等.但我想在第一次出现时用标记显示标题.现在只有在我点击标记时才会显示标题.在v1中是覆盖,但在v2中我没有发现任何类似的东西.

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

azg*_*fer 83

我也偶然发现了这个问题.V2 API是向前迈出的一步,后退两步.谷歌,请在Marker或GoogleMap类上添加一个可覆盖的'draw'方法,以便我们自己定制绘图.

一种可能的解决方案是动态生成位图并将其附加到标记.即创建画布,插入标记位图,在标记旁边绘制文本.这涉及一些痛苦的计算(适当的画布大小与标记位图和文本彼此相邻).遗憾的是,Marker中没有setIcon方法,因此每次文本更改时,都必须创建一个新标记.如果您在地图上只有一个标记可能没问题,但是有几十个标记,这可能不太可行.此外,动态创建这些位图可能存在内存问题.示例代码(仅包含文本):

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)
                                    );
Run Code Online (Sandbox Code Playgroud)

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

  • 很好地解决了v2中引入的一个大缺陷.当他们用来演示地图v2的应用程序Trulia在他们的标记上使用位图上的文字时,他们是如何错过这个的? (3认同)
  • Marker.setIcon()方法现已在最新版本的Maps API中提供(截至2013年5月15日) - https://developers.google.com/maps/documentation/android/reference/com/google/机器人/克/地图/模型/标记#的setIcon(com.google.android.gms.maps.model.BitmapDescriptor) (2认同)

JY2*_*Y2k 48

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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


ved*_*ant 15

似乎您的问题最终在Google I/O会话中得到了解答.

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

它有:

标记聚类 - 处理大量点的显示

热图 - 显示大量的点作为热图

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

使用该库制作的标记

非常重要的是,它可以任何线程上进行修改,因此处理许多标记是轻而易举的


Bry*_*mas 9

我不确定你想要实现的目标:让信息窗口显示而用户不必点击标记,或者使用完全不同的信息窗口视图(或者两者都有).

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

我自己没有对此进行测试,但我猜测Marker.showInfoWindow()会做到这一点(假设Marker的可见性已经存在)true.

为InfoWindow提供自定义视图

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

公共静态界面GoogleMap.InfoWindowAdapter

提供自定义呈现信息窗口的视图.

当显示标记的信息窗口时,无论原因(用户手势或对showInfoWindow()的程序性调用,都会调用此提供程序上的方法.由于任何时候只显示一个信息窗口,此提供程序可以选择重用视图,也可以选择在每个方法调用上创建新视图.

构造信息窗口时,将按定义的顺序调用此类中的方法.要替换默认信息窗口,请使用自定义渲染覆盖getInfoWindow(Marker).要在缺省信息窗口框架(标注气泡)中仅替换信息窗口内容,请保留getInfoWindow(Marker)的默认实现,并覆盖getInfoContents(Marker).

基本上,您是否覆盖getInfoWindow()getInfoContents()取决于您是否只想自定义在标注气泡内看到的内容,或者您​​是否希望自定义整个信息窗口视图,包括标注气泡的替代方案.

一个警告:我相信当你覆盖这些方法时,它会对当时视图的外观getInfoWindow()或被getInfoContents()调用进行简单的渲染.我自己有兴趣尝试复制原生Google Maps Android应用程序的外观,该应用程序在该地名旁边有一个"方向"图标.我认为其中一个问题(参见此处:https://stackoverflow.com/a/13713536/129475),如果您在视图中有类似按钮的东西,由于静态渲染,它可能不像按钮那样.