时间:2010-07-23 20:19:20

标签: android overlay android-mapview

2 个答案:

答案 0 :(得分:0)

我尝试做类似的事情 - 将带有自定义视图的Google地图样式气球绘制到地图上。我尝试覆盖OverlayItem的draw(),并绘制我用XML定义的布局。问题是将View转换为Drawable以绘制到MapView画布上意味着我丢失了Layout的所有事件处理功能,因此按钮等功能无法正常工作。如果您没有对图像上的任何事件担心,那么这可能会起作用,您只需要使用当前的Activity的LayoutInflater(activity.getLayoutInflater())来扩展您的视图,测量并按照下面的描述进行布局。 Android开发者网站上的“Android如何绘制视图”页面(由于新的用户限制无法发布链接,抱歉!),最后在View上调用buildDrawingCache()和getDrawingCache()将其作为Bitmap。然后可以将其绘制到Canvas上,并传递您构建的Overlay子类的draw()方法。

我实际上采用了你建议的第二种方法(将每一种方法作为子视图添加到MapView,最后使用MapView.LayoutParams将布局悬停在OverlayItem上)。我只有一个孩子的视图担心,所以我不太担心这里的效率,如果这实际上是一件值得关注的事情,那对你来说可能更有问题(虽然可能值得先测试)。我对here所做的事情进行了一次小写,并提供了更多细节。

最后你可能想看看android-mapviewballoons对此的处理方法,这值得一看。

答案 1 :(得分:0)

我可以通过将布局转换为drawable来在地图上添加布局作为标记。这是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; } 函数取自this tutorial

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

我使用该方法将位图添加为Marker,如下所示:

{{1}}