在上一篇中,记录了实现这个功能时,遇到的一些问题以及解决,那么这篇就看下具体的实现代码.
该功能的思路及问题解决:
主要功能(参照微信发送定位):
- 1.定位所在位置并且展示周边POI(建筑物等信息);
- 2.拖拽地图完成,返回中心覆盖物所处位置周边的POI信息;
- 3.支持关键词等搜索,每次搜索完成,中央覆盖物移动到第一条POI信息的相应位置;
- 4.点击右上角的图标,中央覆盖物回到所定位的位置;
- 5.点击下边列表的某条数据,将中央覆盖物移至该条数据对应的位置;
- 6.发送定位时,有相应的地图位置截图和地址信息.
代码实现:
下面核心代码, 实现功能1和功能2:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ddress);
initLocation();
initListener();
}
private void initLocation() {
// 打开定位图层,显示当前位置
mbaiduMap.setMyLocationEnabled(true);
BitmapDescriptor mapIndicator = BitmapDescriptorFactory.fromResource(R.drawable.map_indicator);
MyLocationConfiguration config = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.FOLLOWING, //NORMAL普通态 //COMPASS // FOLLOWING跟随态,保持定位图标在地图中心
false, // 是否显示方向
mapIndicator);// 更换图标
mbaiduMap.setMyLocationConfiguration(config);
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);
mbaiduMap.setMapStatus(mapStatusUpdate);
// 创建定位对象
mLocationClient = new LocationClient(this);
// 设置监听器接收结果
mLocationClient.registerLocationListener(new BDAbstractLocationListener() {
@Override // 定位到数据回调此方法
public void onReceiveLocation(BDLocation location) {
isFirstLocation = true;
if (location == null) {
return;
}
if(jobAddress != null){
jobAddress.clear();
}
// 详细的地址信息
mCurrAddrStr = location.getAddrStr();
mCity = location.getCity(); // 城市
mCurrLatitude = location.getLatitude(); // 纬度
mCurrLongitude = location.getLongitude(); // 经度
initSearch();
refreshBaiduMap(mCurrLatitude,mCurrLongitude,radius);
}
});
}
private void refreshBaiduMap(double currLatitude,double currLongitude,float accuracy){
MyLocationData datas = new MyLocationData
.Builder()
.latitude(currLatitude) // 纬度
.longitude(currLongitude) // 经度
.accuracy(accuracy) // 定位的精度
.build();
// 更新我的位置, 刷新界面显示
mbaiduMap.setMyLocationData(datas);
}
@Override
public void initListener() {
mbaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}
@Override
public void onMapStatusChangeStart(MapStatus mapStatus, int i) {
Log.i("onMapStatusChangeStart,触发的类型 == " + i);
}
@Override
public void onMapStatusChange(MapStatus mapStatus) {
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
//定位完成和移动回到原点时会触发
if(isFirstLocation){
//是否定位到原点
mapCenterLatLng = mapStatus.target;
getAddressData(mapCenterLatLng);
}
}
});
mbaiduMap.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
@Override
public void onTouch(MotionEvent motionEvent) {
switch(motionEvent.getAction()){
case MotionEvent.ACTION_UP:
mapCenterLatLng = mbaiduMap.getMapStatus().target;
//获取周边POI
getAddressData(mapCenterLatLng);
break;
}
}
});
mbaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public