0.前言:
这篇我们来讲如何添加覆盖物。
先看效果图:本文就是要实现这么一个效果图:
1.模拟数据传入并生成覆盖物:
/***
* 初始化图层
* 这一段代码一旦执行,地图上就出现了所传入的覆盖物信息
* @param infos 模拟数据,覆盖物的点
*/
public void addInfosOverlay(List<Info> infos)
{
mBaiduMap.clear();
LatLng latLng = null;
OverlayOptions overlayOptions = null;
Marker marker = null;
//遍历添加覆盖物信息
for (Info info : infos){
// 位置
latLng = new LatLng(info.getLatitude(), info.getLongitude());
// 覆盖物的图标
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.map_pos_icon);
overlayOptions = new MarkerOptions().position(latLng).icon(bitmap).zIndex(5);
marker = (Marker) (mBaiduMap.addOverlay(overlayOptions));//core
//为marker带上数据
Bundle bundle = new Bundle();
bundle.putSerializable("info", info);
marker.setExtraInfo(bundle);
}
// // 可选操作 将地图移到到最后一个经纬度位置
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.setMapStatus(u);
}
Info是封装了经纬度等扩展信息的的一个实体类。我将其设置进一个按钮的点击事件,一点击该按钮就触发这个方法用于模拟服务器拉取到的数据,执行完成后地图上应该就添上了若干个覆盖物了。具体的可以看demo内的代码。
2.marker的点击事件:
先来个原生态的,这样方便理解。
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
Log.e("marker click"," marker >> " + marker.getId());
return true;
}
});
没啥可说的,注意API就行了,就是注意他这个是用mBaiduMap这个对象对整张地图的marker进行点击的设置。一旦设置,全图生效。
然后我们看在添加覆盖物的时候,我们为覆盖物都设置了一个bundle数据——info。那么我们来改造下。
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
// Log.e("marker click"," marker >> " + marker.getId());
Bundle extraInfo = marker.getExtraInfo();
Info info = (Info) extraInfo.getSerializable("info");
String name = info.getName();
Log.e("marker click"," name >> " + name);
return true;
}
});
Log输出:我们把marker携带的数据给取出来,并打印出了名字。
11-20 11:13:18.371 32645-32645/zj.shitmap E/marker click: name >> 老米家泡馍小炒
11-20 11:13:19.107 32645-32645/zj.shitmap E/marker click: name >> 老米家泡馍小炒
11-20 11:13:22.701 32645-32645/zj.shitmap E/marker click: name >> 沙井国际洗浴会所
11-20 11:13:26.035 32645-32645/zj.shitmap E/marker click: name >> 英伦贵族小旅馆
11-20 11:13:28.890 32645-32645/zj.shitmap E/marker click: name >> 五环服装城
从上而知,既然marker能携带数据,那么我们便可以以此为支点,做很多事情。比如弹出一个底部详情布局(利用marker携带的数据),也可以弹出一个infoWindow。
基于熟悉api和控件的考虑,我们利用marker的点击来弹出一个infoWindow吧。
3.InfoWindow:
核心代码:
/**
* 显示infoWindow
*/
mBaiduMap.hideInfoWindow();
InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
Log.e("marker click"," 点击Marker >> ");
}
};
RelativeLayout fathersRootView = (RelativeLayout) findViewById(R.id.activity_main);
RelativeLayout popupCommonClickRelativeLayout = (RelativeLayout) LayoutInflater.from(getBaseContext())
.inflate(R.layout.map_infowindow_common,
fathersRootView,
false);
TextView subText = (TextView) popupCommonClickRelativeLayout.findViewById(R.id.infowindow_common_click_name);
subText.setText(name);
InfoWindow window = new InfoWindow(BitmapDescriptorFactory.fromView(popupCommonClickRelativeLayout),
marker.getPosition(),
-100,
listener);
mBaiduMap.showInfoWindow(window);
注意在设置infoWindow的textView信息,必须要在addInfoWindow之前。否则设置不生效。
且这段代码时写在marker的点击事件内的,所以一点击的时候,将数据拿出来,设置到infoWindow所依赖的view上边,然后再将该View加入到infoWwindow。