问题一:采用哪种覆盖物
本来想用百度地图的图片覆盖物功能,图片覆盖物有一个很好的优点,就是图片的大小会随着MapView的ZoomLevel变化而变化,非常的方便,但是利用图片覆盖物的话有一个致命的缺点:就是很难获取到点击事件。
所以,我接下来想到用自定义View作为覆盖物。这样就可以很方便地获取触摸事件。可是问题又来了,自定义View的话效果很一般(移动地图的时候自定义View会出现严重的漂移,严重影响视觉效果)
最后,采用自定义图层的办法(ItemizdOverlay)
自定义图层的话,每次只需要往图层上面加入OverlayItem,当点击item时,可以获取item的标识,而overly可以通过标识获取相应的item
问题二:怎么防止mark过多
如果发布一张图片就在地图上插上一个mark,这样将会使得地图的mark变得密密麻麻。
所以采取以下策略:
1)判断ZOOMLevel。
2)ZoomLevel在某个范围内就显示该范围对应的mark(例如:14<ZoomLevel<16,显示最小的mark)
实现方法:给地图添加一个状态监听器,获取得到zoom,转换为zoomLevel,如果zoomLevel改变,就改变overlay上面的OverItem 核心代码如下:
1 if(zoomLevel != NowZoomLevel || zoomLevel == 0){ 2 NowZoomLevel = zoomLevel; 3 switch(zoomLevel){ 4 case 0: 5 Log.e("MapStatusListener","zoomLevel=0"); 6 mMapController.setZoom(MapViewUtil.ZOOM_MIN_LEVEL); 7 mMapController.setCenter(GeoPointUtil.centerGeoPoint); 8 overlay.removeAll(); 9 overlay.addItem(new SmallMarkItems(TestGeoPointSmall.getSmallGeoPointList()).createSmallMarkItemsList()); 10 break; 11 case 1: 12 Log.e("MapStatusListener","zoomLevel=1"); 13 overlay.removeAll(); 14 overlay.addItem(new SmallMarkItems(TestGeoPointSmall.getSmallGeoPointList()).createSmallMarkItemsList()); 15 break; 16 case 2: 17 Log.e("MapStatusListener","zoomLevel=2"); 18 overlay.removeAll(); 19 overlay.addItem(new MiddleMarkItems(TestGeoPointMiddle.getMiddleGeoPointList()).createMiddleMarkItemsList()); 20 break; 21 case 3: 22 overlay.removeAll(); 23 overlay.addItem(new BigMarkItems(TestGeoPointMiddle.getMiddleGeoPointList()).createMiddleMarkItemsList()); 24 Log.e("MapStatusListener","zoomLevel=3"); 25 break; 26 default: 27 Log.e("MapStatusListener","zoomLevelDefault"); 28 break; 29 } 30 mMapView.refresh(); 31 }