通過在MapView上添加覆蓋層,可以在指定的位置上添加注解、繪制圖像等。Google地圖上可以加入多個覆蓋層,所有覆蓋層均都在地圖圖層之上,每個覆蓋層均可以對用戶的點擊事件做出響應。
創(chuàng)建覆蓋層繼承Overlay類的子類,并通過重載draw()方法為指定位置添加注解,重載onTap()方法處理用戶的點擊操作。
代碼清單1所示的代碼是創(chuàng)建Overlay的小代碼集合。
代碼清單1 創(chuàng)建Overlay
public class TextOverlay extends Overlay {
//draw()中傳入的參數(shù)中,shadow變量是用來區(qū)分繪制圖層的: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)來實現(xiàn),繪制的位置是屏幕坐標,這就需要將地圖上的物理坐標與屏幕坐標進行轉換;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);
//開啟了平滑設置,防止文字出現(xiàn)鋸齒
paint.setAntiAlias(true);
paint.setFakeBoldText(true);
//繪制了圓形的標記點
canvas.drawOval(oval, paint);
//繪制了提示文字,第2個和第3個參數(shù)是繪制屏幕的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;
}
}