从2.0.0版本开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。
添加覆盖物的一般流程如下:
1. 创建OverlayItem,准备overlay数据;
2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem)} 接口添加overlay。
3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
4. 调用MapView.refresh() 使Overlay生效
下面我们就一起来挨个步骤来实现。
首先,先创建OverlayTest,继承ItemizedOverlay。相关事件在该方法中处理。核心代码如下:
class OverlayTest extends ItemizedOverlay<OverlayItem>{
public OverlayTest(Drawable marker, MapView mapView) {
super(marker, mapView);
}
/**
* 再次处理Mapview的点击事件,当返回true
*/
public boolean onTap(GeoPoint arg0, MapView arg1) {
super.onTap(arg0, arg1);
return false;
}
/**
* 在此处理item点击事件
*/
protected boolean onTap(int index) {
System.out.println("item onTap: "+index);
return true;
}
}
接下来,就是开始自定义图层的实现了。
1、创建OverlayItem,准备overlay数据,此处添加三个自定义图层。具体核心代码如下:
// 1 创建OverlayItem,准备overlay数据;
//准备要添加的Overlay
double mLat1 = 39.90923;
double mLon1 = 116.397428;
double mLat2 = 39.9022;
double mLon2 = 116.3922;
double mLat3 = 39.917723;
double mLon3 = 116.3722;
// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));
GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));
//准备overlay图像数据,根据实情情况修复
Drawable mark= getResources().getDrawable(R.drawable.ic_launcher);
//用OverlayItem准备Overlay数据
OverlayItem item1 = new OverlayItem(p1,"item1","item1");
//使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置
OverlayItem item2 = new OverlayItem(p2,"item2","item2");
item2.setMarker(mark);
OverlayItem item3 = new OverlayItem(p3,"item3","item3");
2、
创建ItemizedOverlay实例,调用 addItem(OverlayItem)} 接口添加overlay。代码如下:
// 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem)} 接口添加overlay。
//创建IteminizedOverlay
OverlayTest itemOverlay = new OverlayTest(mark, mapView); // 此处方法为自己创建的类,继承自ItemizedOverlay<OverlayItem>
//将IteminizedOverlay添加到MapView中
//注意:目前IteminizedOverlay不支持多实例,MapView中只能有一个IteminizedOverlay实例
3、
调用MapView.getOverlays().add()方法添加overlay到mapview中。
// 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
mapView.getOverlays().clear();
mapView.getOverlays().add(itemOverlay);
//现在所有准备工作已准备好,使用以下方法管理overlay.
//添加overlay, 当批量添加Overlay时使用addItem(List<OverlayItem>)效率更高
itemOverlay.addItem(item1);
itemOverlay.addItem(item2);
itemOverlay.addItem(item3);
4. 调用MapView.refresh() 使Overlay生效
//4. 调用MapView.refresh() 使Overlay生效
mapView.refresh();
运行后的效果如下图: