在项目中遇到一个问题,需要在百度地图上添加一个自定义的覆盖物,看了一下官方的文档没有找到能够满足要求的(也许是我没有发现)。我想肯定有其它的方法,这里我给一种我自己的解决方法。
思路:官方提供的覆盖物类(ItemizedOverlay<OverlayItem>)可以继承,然后自定义,但是它接受的是一个Drawable对象。于是我采用的是将自定义的一个view转换为一个Drawable的方式来实现。
效果如图所示:
首先加载自定义的一个view,然后将view中控件的值填上。创建一个空的bitmap对象,使用view的draw方法,将view绘制在bitmap中。关键代码:
LayoutInflater mInflater = LayoutInflater.from(context);
View view = mInflater.inflate(R.layout.layer, null);
//获取背景图片的宽和高
Drawable d = context.getResources().getDrawable(R.drawable.search_annotation_red);
Bitmap b = Bitmap.createBitmap(d.getMinimumWidth(), d.getMinimumHeight(), Bitmap.Config.RGB_565);
//设置名字
view.draw(new Canvas(b));
private static Bitmap getViewBitmap(View view) {
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
百度地图的覆盖物类:
/**覆盖物*/
class OverlayTest extends ItemizedOverlay<OverlayItem> {
private Context mContext = null;
public OverlayTest(Drawable marker,Context context, MapView mapView){
super(marker,mapView);
this.mContext = context;
}
protected boolean onTap(int index) {
/**
* TODO
* 这里响应点击事件,启动activity或者其它处理
*/
Toast.makeText(MainActivity.this, "点击目标", Toast.LENGTH_SHORT).show();
return true;
}
public boolean onTap(GeoPoint pt, MapView mapView){
super.onTap(pt,mapView);
return false;
}
}
本demo下载地址:http://download.csdn.net/detail/u011421480/5856255