2010-07-23 45 views
1

是否可以使用XML中定义的布局作为OverlayItem添加到MapView,而不是只绘制一个drawable?我在地图上绘制了几个叠加层,但他们只是单个图像,我现在想要放置更复杂的对象而不是简单的可绘制的叠加层。在MapView上使用布局作为OverlayItem?

我打算用里面的动态图像绘制一个标记(只是一个朋友定位器类型的东西),其中每个标记有一个不同的图片里面。

添加这些作为OverlayItems的方式去做或我需要将每一个添加到MapView作为子视图(这似乎是效率低下)?

回答

0

我正在尝试做类似的事情 - 将带有自定义视图的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的方法,这很值得一看。

0

我能够通过将布局转换为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);