通过在MapView上添加覆盖层,可以在指定的位置上添加注解、绘制图像等。Google地图上可以加入多个覆盖层,所有覆盖层均都在地图图层之上,每个覆盖层均可以对用户的点击事件做出响应。
创建覆盖层继承Overlay类的子类,并通过重载draw()方法为指定位置添加注解,重载onTap()方法处理用户的点击操作。
代码清单1所示的代码是创建Overlay的小代码集合。
代码清单1 创建Overlay
public class TextOverlay extends Overlay {
//draw()中传入的参数中,shadow变量是用来区分绘制图层的:false表示在覆盖层上进行绘制;true则表示在隐藏层上进行绘制
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
if (shadow == false){
}
else{
}
super.draw(canvas, mapView, shadow);
}
//onTap()方法的返回值:返回false表示覆盖层不处理点击事件;返回true则表示已经处理了点击事件
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
return false;
}
}
在覆盖层绘制图形或文字需要使用“画布”(Canvas)来实现,绘制的位置是屏幕坐标,这就需要将地图上的物理坐标与屏幕坐标进行转换;Projection类提供了物理坐标和屏幕坐标的转换功能,可在经度和纬度表示的GeoPoint点和屏幕上Point点进行转换,toPixels()方法将物理坐标转换为屏幕坐标,fromPixels()方法将屏幕坐标转换为物理坐标。
两个方法的具体使用方法可以参考代码清单2所示的代码。
代码清单2 物理坐标和屏幕坐标的转换
Projection projection = mapView.getProjection();
projection.toPixels(geoPoint, point);
projection.fromPixels(point.x, point.y);
以下内容以MapOverlayDemo示例,说明如何在Google地图上添加覆盖层,并在预订的物理坐标上显示提示信息。图1是MapOverlayDemo示例的运行结果。

图1 MapOverlayDemo示例的运行结果
TextOverlay类是MapOverlayDemo示例的覆盖层,主要重载了draw()方法,在指定的物理坐标上绘制了标记点和提示文字。TextOverlay.java文件的核心代码如代码清单3所示。
代码清单3 TextOverlay.java核心代码
public class TextOverlay extends Overlay {
//定义了绘制半径变量mRadius,供定义绘制范围使用
private final int mRadius = 5;
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
if (shadow == false){
Double lng = 116.391483 * 1E6;
Double lat = 39.9055472 * 1E6;
GeoPoint geoPoint = new GeoPoint(lat.intValue(), lng.intValue());
Point point = new Point();
//使用Projection完成了从物理坐标到屏幕坐标的转换
projection.toPixels(geoPoint, point);
//oval设定标记点的大小
RectF oval = new RectF(point.x - mRadius, point.y - mRadius, point.x + mRadius, point.y + mRadius);
Paint paint = new Paint();
//设置了绘制颜色
paint.setARGB(250, 250, 0, 0);
//开启了平滑设置,防止文字出现锯齿
paint.setAntiAlias(true);
paint.setFakeBoldText(true);
//绘制了圆形的标记点
canvas.drawOval(oval, paint);
//绘制了提示文字,第2个和第3个参数是绘制屏幕的x坐标和y坐标
canvas.drawText("标记点", point.x+2*mRadius, point.y, paint);
}
super.draw(canvas, mapView, shadow);
}
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
return false;
}
}
建立了覆盖层后,还需要把覆盖层添加到MapView上。MapOverlayDemo.java的核心代码如代码清单4所示。
代码清单4 MapOverlayDemo.java的核心代码
public class MapOverlayDemo extends MapActivity {
private MapView mapView;
private MapController mapController;
private TextOverlay textOverlay;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapview);
mapController = mapView.getController();
Double lng = 126.676530486 * 1E6;
Double lat = 45.7698895661 * 1E6;
GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());
mapController.setCenter(point);
mapController.setZoom(11);
mapController.animateTo(point);
//实例化了TextOverlay对象
textOverlay = new TextOverlay();
//获取MapView已有的覆盖层
List<Overlay> overlays = mapView.getOverlays();
//将TextOverlay对象添加到MapView中
overlays.add(textOverlay);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}