是否可以使用XML中定义的布局作为OverlayItem添加到MapView,而不是只绘制一个drawable?我在地图上绘制了几个叠加层,但他们只是单个图像,我现在想要放置更复杂的对象而不是简单的可绘制的叠加层。在MapView上使用布局作为OverlayItem?
我打算用里面的动态图像绘制一个标记(只是一个朋友定位器类型的东西),其中每个标记有一个不同的图片里面。
添加这些作为OverlayItems的方式去做或我需要将每一个添加到MapView作为子视图(这似乎是效率低下)?
是否可以使用XML中定义的布局作为OverlayItem添加到MapView,而不是只绘制一个drawable?我在地图上绘制了几个叠加层,但他们只是单个图像,我现在想要放置更复杂的对象而不是简单的可绘制的叠加层。在MapView上使用布局作为OverlayItem?
我打算用里面的动态图像绘制一个标记(只是一个朋友定位器类型的东西),其中每个标记有一个不同的图片里面。
添加这些作为OverlayItems的方式去做或我需要将每一个添加到MapView作为子视图(这似乎是效率低下)?
我正在尝试做类似的事情 - 将带有自定义视图的Google地图样式气球绘制到地图上。我尝试覆盖OverlayItem的draw(),并绘制我以XML方式定义的布局。问题在于将视图转换为Drawable来绘制到MapView画布上,意味着我失去了Layout的所有事件处理功能,所以像按钮等事情无法正常工作。如果图像上没有任何事件需要担心,那么这可能会起作用,您只需使用当前Activity的LayoutInflater(activity.getLayoutInflater())为视图充气,然后按照'android如何在android开发人员站点上绘制视图'页面(由于新的用户限制,无法发布链接,对不起!),最后在View上调用buildDrawingCache()和getDrawingCache()以将其作为位图。然后可以将其绘制到Canvas上,并通过您创建的Overlay的子类的draw()方法。
我实际上是为你提出的第二种方法(将每一个作为子视图添加到MapView中,使用MapView.LayoutParams将布局悬停在OverlayItem上)。我只有一个孩子的观点可以担心,但我并不太担心这里的效率,如果这实际上是值得关注的东西(这可能值得首先测试),那么对您来说这可能更成问题。有一点我写的here更详细一点。
最后,你可能想看看android-mapviewballoons的方法,这很值得一看。
我能够通过将布局转换为drawable来将布局添加为地图上的标记。下面是从this tutorial采取bitmapFromView
功能:
public static Bitmap bitmapFromView(View layout, int width, int height, Context context) {
// Create a new bitmap and a new canvas using that bitmap
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
layout.setDrawingCacheEnabled(true);
// Supply measurements
layout.measure(View.MeasureSpec.makeMeasureSpec(canvas.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(canvas.getHeight(), View.MeasureSpec.EXACTLY));
// Apply the measures so the layout would resize before drawing.
layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());
// and now the bmp object will actually contain the requested layout
canvas.drawBitmap(layout.getDrawingCache(), 0, 0, new Paint());
return bmp;
}
我用的方法将位图添加为这样的标记:
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.MY_LAYOUT, null);
Bitmap markerBitmap = bitmapFromView(layout, MY_WIDTH, MY_HEIGHT, context);
MarkerOptions markerOptions = new MarkerOptions()
.title(MY_TITLE)
.position(MY_POSITION)
.icon(BitmapDescriptorFactory.fromBitmap(markerBitmap));
map.addMarker(markerOptions);