地圖覆蓋物分為兩種:一種帶聚合效果的铃彰,一種是不帶聚合效果的趴俘。
首先你得有個(gè)KEY,在百度地圖API上注冊(cè)為開發(fā)者后掌眠,你就可以創(chuàng)建一個(gè)應(yīng)用蕾盯,記得選Android類型,因?yàn)槟J(rèn)是服務(wù)器類型蓝丙。
之后在AndroidManifest上加上下面這些(網(wǎng)絡(luò)级遭、定位權(quán)限的就不需要列出了吧)望拖,最后在APPlication中初始化SDKInitializer.initialize(this);,這樣你的的MapView就可以跑起來啦挫鸽!
一说敏、帶聚合效果的,先來看圖:
實(shí)現(xiàn)的方式很簡(jiǎn)單丢郊。
1盔沫、到百度地圖開放平臺(tái)上進(jìn)行注冊(cè),下載jar包枫匾,導(dǎo)入到項(xiàng)目中去架诞,結(jié)合著開發(fā)文檔和官方Demo。
2干茉、主要涉及到兩個(gè)重要的類MarkerOptions和Marker谴忧。MarkerOptions主要負(fù)責(zé)配置覆蓋物的一些屬性信息。Marker指覆蓋物角虫,MarkerOptions和Marker結(jié)合起來用沾谓,就組成了覆蓋物。
3上遥、MarkerOptions配置
//覆蓋物僅僅是圖標(biāo)
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.map_personal);
//如果覆蓋物是需要自定義的話搏屑,比如圖標(biāo)和文字是服務(wù)器返回的,就可以定義一個(gè)View布局
然后BitmapDescriptorFactory.fromView(View view);
MarkerOptions options = new MarkerOptions();
options.position(newLatLng(sellers.get(i).getLatitude(),sellers.get(i).getLongitude())) // 位置
.title(sellers.get(i).getName()) // title
.icon(icon) // 圖標(biāo)
.anchor(0.5f, 0.5f);//設(shè)置 marker 覆蓋物的錨點(diǎn)比例粉楚,默認(rèn)(0.5f, 1.0f)水平居中辣恋,垂直下對(duì)齊
// 覆蓋物動(dòng)畫
options.animateType(MarkerOptions.MarkerAnimateType.grow);
4、Marker配置
Marker mMarker = (Marker) (baiduMap.addOverlay(options));//初始化Marker模软,并顯示Marker伟骨。
//這里
Bundle bundle = new Bundle();
bundle.putSerializable(IntentConstants.SELL_CONTENT_KEY, sellers.get(i));
mMarker.setExtraInfo(bundle);
5、把以上代碼放到一個(gè)循環(huán)里面燃异,就得到了多個(gè)Marker
6携狭、Marker的點(diǎn)擊事件處理:
BaiduMap.OnMarkerClickListener,通常來說,點(diǎn)擊Marker回俐,需要彈出一個(gè)彈窗信息逛腿,來展示覆蓋代表的信息。
在第四步初始化完Marker之后仅颇,添加一個(gè)bundle单默,然后點(diǎn)擊覆蓋物的時(shí)候使用。
baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
//marker代表點(diǎn)擊的那個(gè)覆蓋物忘瓦,
//從bundle取出marker的信息
Bundle bundle2 = marker.getExtraInfo();
final Seller seller = (Seller) bundle2.getSerializable(IntentConstants.SELL_CONTENT_KEY);
}
return true搁廓;
});
7、點(diǎn)擊出現(xiàn)彈窗信息,彈窗的基本類InfoWindow,初始化的時(shí)候境蜕,彈窗的布局可以隨意進(jìn)行配置可以隨便進(jìn)行配置蝙场。
//初始化顯示的位置(1.窗口的內(nèi)容,2位置粱年,3.y軸偏移量)
// mInfoWindow = new InfoWindow(markView, marker.getPosition(), -47,listener);
mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(markView), marker.getPosition(), -47, listener);
//顯示當(dāng)前的infowindow
baiduMap.showInfoWindow(mInfoWindow);
//點(diǎn)擊inforWindow的事件
InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {
public void onInfoWindowClick() {
// 1售滤。移動(dòng)到地圖的中心
moveMapTo(seller.getLatitude(), seller.getLongitude(), true);
//2.底部popWindow彈出//
showMapStationInfo(seller);
}
};
二、有的時(shí)候逼泣,需要打開的地圖的時(shí)候趴泌,覆蓋物直接顯示所有的信息,而且?guī)в芯酆系男Ч鸵玫囊粋€(gè)類ClusterItem嗜憔,先上圖:
聚合后的效果:
1、先從官方Demo中拷貝clusterutil包到項(xiàng)目中氏仗。
2吉捶、實(shí)現(xiàn)聚合效果,兩個(gè)最主要的類ClusterManager和ClusterItem
/**
* 每個(gè)Marker點(diǎn)皆尔,包含Marker點(diǎn)坐標(biāo)以及圖標(biāo)
*/
public class MyItem implements ClusterItem {
private ChargeStation chargeStation;
public MyItem(ChargeStation chargeStation){
this.chargeStation = chargeStation;
}
@Override
public LatLng getPosition(){
return new LatLng(chargeStation.getLatitude(),chargeStation.getLongitude());
}
@Override //隨意定義聚合物的樣式
public BitmapDescriptor getBitmapDescriptor(){
View view = mInflater.inflate(R.layout.map_pile_mark_infowindow, null);
TextView name = (TextView) view.findViewById(R.id.tv_title);
name.setText(chargeStation.getName());
return BitmapDescriptorFactory.fromView(view);
}
}
3呐舔、初始化點(diǎn)聚合管理類ClusterManager,返回所有聚合點(diǎn)的集合慷蠕,參數(shù)信息應(yīng)該能看懂珊拼。
ClusterManager<MyItem> mClusterManager = new ClusterManager<>(getAbstractActivity(), baiduMap);
4、覆蓋物及覆蓋物的點(diǎn)擊事件
// 設(shè)置maker點(diǎn)擊時(shí)的響應(yīng)
baiduMap.setOnMarkerClickListener(mClusterManager);
mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
@Override
public boolean onClusterClick(Cluster<MyItem> cluster) {
Toast.makeText(getAbstractActivity(),
"有" + cluster.getSize() + "個(gè)點(diǎn)", Toast.LENGTH_SHORT).show();
moveMapTo(cluster.getPosition().latitude,cluster.getPosition().longitude,true,ZOOM_LEVE_POINT+1);
return false;
}
});
mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
@Override
public boolean onClusterItemClick(MyItem item) {
Toast.makeText(getAbstractActivity(),
"點(diǎn)擊單個(gè)Item", Toast.LENGTH_SHORT).show();
//1流炕。移動(dòng)到地圖的中心
// moveMapTo(item.getLongitude(), chargeStation.getLatitude(), true);
moveMapTo(item.getPosition().latitude,item.getPosition().longitude,true);
//2.底部popWindow彈出//
showMapStationInfo(item.chargeStation);
return false;
}
});
三澎现、擴(kuò)展功能:
1、NonHierarchicalDistanceBasedAlgorithm類里面的
這個(gè)類的主MAX_DISTANCE_AT_ZOOM每辟,代表多遠(yuǎn)的距離可以聚合剑辫。
2、如果要修改聚合的樣式的話渠欺,就要相應(yīng)的修改源碼了妹蔽。
有一篇文章講的特別好,可以參考這里戀貓大神的文章寫得很完整挠将。