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旋转功能.
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 - 在你的标记上显示文字(见截图)
非常重要的是,它可以在任何线程上进行修改,因此处理许多标记是轻而易举的
我不确定你想要实现的目标:让信息窗口显示而用户不必点击标记,或者使用完全不同的信息窗口视图(或者两者都有).
我自己没有对此进行测试,但我猜测Marker.showInfoWindow()会做到这一点(假设Marker的可见性已经存在)true
.
这里有两个选项,你应该参考GoogleMap.InfoWindowAdapter上的文档:
公共静态界面GoogleMap.InfoWindowAdapter
提供自定义呈现信息窗口的视图.
当显示标记的信息窗口时,无论原因(用户手势或对showInfoWindow()的程序性调用,都会调用此提供程序上的方法.由于任何时候只显示一个信息窗口,此提供程序可以选择重用视图,也可以选择在每个方法调用上创建新视图.
构造信息窗口时,将按定义的顺序调用此类中的方法.要替换默认信息窗口,请使用自定义渲染覆盖getInfoWindow(Marker).要在缺省信息窗口框架(标注气泡)中仅替换信息窗口内容,请保留getInfoWindow(Marker)的默认实现,并覆盖getInfoContents(Marker).
基本上,您是否覆盖getInfoWindow()
或getInfoContents()
取决于您是否只想自定义在标注气泡内看到的内容,或者您是否希望自定义整个信息窗口视图,包括标注气泡的替代方案.
一个警告:我相信当你覆盖这些方法时,它会对当时视图的外观getInfoWindow()
或被getInfoContents()
调用进行简单的渲染.我自己有兴趣尝试复制原生Google Maps Android应用程序的外观,该应用程序在该地名旁边有一个"方向"图标.我认为其中一个问题(参见此处:https://stackoverflow.com/a/13713536/129475),如果您在视图中有类似按钮的东西,由于静态渲染,它可能不像按钮那样.
归档时间: |
|
查看次数: |
78257 次 |
最近记录: |