百度地图的使用(3)

来源:互联网 发布:html转xml python 编辑:程序博客网 时间:2024/06/06 15:18
百度地图的使用(1)地址:http://blog.csdn.net/daidaishuiping/article/details/69844681
百度地图的使用(2)地址:http://blog.csdn.net/daidaishuiping/article/details/69845041
百度地图的使用(3)地址:http://blog.csdn.net/daidaishuiping/article/details/69845265
百度地图的使用(4)地址:http://blog.csdn.net/daidaishuiping/article/details/69938861
源码地址:http://download.csdn.net/detail/daidaishuiping/9808471
百度地图覆盖物使用步骤(在百度地图使用1和百度地图使用2基础上):
1、初始化覆盖物initMarker()
2、添加覆盖物 addOverlays(Info.infoList);
3、为覆盖物添加点击事件clickMarker();
4、设置InfoWindowStyle样式setInfoWindowStyle(marker, info);
5、点击地图移除覆盖物clickBaiDuMap();

代码:
public class MainActivity extends AppCompatActivity {

private MapView mapView;
private BaiduMap baiduMap;
private Context context;
// 定位相关
private LocationClient locationClient;
private MyBDLocationListener listener;
private boolean isFirstIn = true;// 第一次定位
private BitmapDescriptor mIconLocation;// 自定义图片
private MyOrientationListener myOrientationListener;// 传感器监听
private float mCurrentX;// 记录当期位置
// 覆盖物相关
private BitmapDescriptor mMarker;//覆盖物图标
private RelativeLayout mMarkerLy;// 覆盖物布局

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.context = this;
initView();
// 初始化定位
initLocation();
// 初始化覆盖物
initMarker();
}

/**
* 初始化地图
*/
private void initView() {
mapView = (MapView) findViewById(R.id.mapView);
baiduMap = mapView.getMap();
// 缩放比例
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
baiduMap.setMapStatus(msu);
}

/**
* 设置定位相关的信息
*/
private void initLocation() {

locationClient = new LocationClient(this);
listener = new MyBDLocationListener();
locationClient.registerLocationListener(listener);

LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");// 设置坐标类型
option.setIsNeedAddress(true);// 返回当前位置
option.setOpenGps(true);// 打开GPS
option.setScanSpan(1000); // 设置每隔多少秒进行一次请求
locationClient.setLocOption(option);
// 初始化图标
mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.icon_gps_location);
// 初始化传感器
myOrientationListener = new MyOrientationListener(context);
// 接口回调
myOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
@Override
public void onOrientationChanged(float x) {
mCurrentX = x;
}
});
}

@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}

@Override
protected void onStart() {
super.onStart();
// 启动时,默认开启定位
baiduMap.setMyLocationEnabled(true);
if (!locationClient.isStarted()) {
locationClient.start();
// 开启方向传感器
myOrientationListener.start();
}
}

@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}

@Override
protected void onStop() {
super.onStop();
// 关闭定位
baiduMap.setMyLocationEnabled(false);
locationClient.stop();
// 停止方向传感器
myOrientationListener.stop();
}

@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
}

/**
* 实现BDLocationListener接口
*/
private class MyBDLocationListener implements BDLocationListener {

@Override
public void onReceiveLocation(BDLocation location) {

MyLocationData data = new MyLocationData.Builder()
.direction(mCurrentX)//设置方向
.accuracy(location.getRadius())//获取定位精准度
.longitude(location.getLongitude())//获取经度信息
.latitude(location.getLatitude())//获取纬度信息
.build();
baiduMap.setMyLocationData(data);

// 设置自定义图标
MyLocationConfiguration configuration = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.NORMAL, true, mIconLocation);
baiduMap.setMyLocationConfiguration(configuration);

if (isFirstIn) {
isFirstIn = false;
// 设置精度location.getLatitude()和纬度location.getLongitude()
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(msu);// 地图的位置使用动画的效果传过去
//location.getAddrStr()//获取地址信息
Toast.makeText(context, location.getAddrStr(), Toast.LENGTH_SHORT).show();
}
}

@Override
public void onConnectHotSpotMessage(String s, int i) {
Log.e("info", "s=" + s + ",i=" + i);
}

}

/**
* 初始化覆盖物
*/
private void initMarker() {
mMarker = BitmapDescriptorFactory.fromResource(R.drawable.maker);
mMarkerLy = (RelativeLayout) findViewById(R.id.id_maker_ly);
// 对Marker的点击
clickMarker();
//点击地图
clickBaiDuMap();
}

/**
* 点击覆盖物
*/
private void clickMarker() {
baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// 获得marker中的数据
Bundle extraInfo = marker.getExtraInfo();
Info info = (Info) extraInfo.getSerializable("info");
ImageView iv = (ImageView) mMarkerLy.findViewById(R.id.id_info_img);
TextView distance = (TextView) mMarkerLy.findViewById(R.id.id_info_distance);
TextView name = (TextView) mMarkerLy.findViewById(R.id.id_info_name);
TextView zan = (TextView) mMarkerLy.findViewById(R.id.id_info_zan);
iv.setImageResource(info.getImgId());
distance.setText(info.getDistance());
name.setText(info.getName());
zan.setText("" + info.getZan());
// 设置详细信息布局为可见
mMarkerLy.setVisibility(View.VISIBLE);
//设置InfoWindowStyle样式
setInfoWindowStyle(marker, info);
return true;
}
});
}


/**
* 设置InfoWindow显示样式
*
* @param marker
* @param info
*/
private void setInfoWindowStyle(Marker marker, Info info) {
// 生成一个TextView用户在地图中显示InfoWindow
TextView tv = new TextView(context);
tv.setBackgroundResource(R.drawable.location_tips);
tv.setPadding(30, 10, 30, 50);
tv.setText(info.getName());
tv.setGravity(Gravity.CENTER);
tv.setTextColor(Color.parseColor("#ffffff"));

// 将marker所在的经纬度的信息转化成屏幕上的坐标
final LatLng latLng = marker.getPosition();
Point p = baiduMap.getProjection().toScreenLocation(latLng);
p.x -= 7;
p.y -= 47;
LatLng ll = baiduMap.getProjection().fromScreenLocation(p);

// TextView 变成 View 图片
BitmapDescriptor descriptor = BitmapDescriptorFactory
.fromView(tv);
// 为弹出的InfoWindow添加点击事件
InfoWindow infoWindow = new InfoWindow(descriptor, ll, 0,
new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
baiduMap.hideInfoWindow();
}
});
// 显示InfoWindow
baiduMap.showInfoWindow(infoWindow);
}

/**
* 点击地图
*/
private void clickBaiDuMap() {

baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
mMarkerLy.setVisibility(View.GONE);//隐藏覆盖物布局
baiduMap.hideInfoWindow();//隐藏InfoWindow
}

@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
}


/**
* 添加覆盖物
*/
private void addOverlays(List<Info> infoList) {
baiduMap.clear();// 清除地图上的图层
LatLng latLng = null;// 经纬度对象
OverlayOptions options;
for (Info info : infoList) {
// 经纬度
latLng = new LatLng(info.getLatitude(), info.getLongitude());
// 添加覆盖物图标
options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);
Marker marker = (Marker) baiduMap.addOverlay(options);
//把覆盖物与所对应的数据源
Bundle bundle = new Bundle();
bundle.putSerializable("info", info);
marker.setExtraInfo(bundle);
}
// 把地图移动到最后一个maker的地址
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.setMapStatus(msu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {
case R.id.id_add_overlay:
addOverlays(Info.infoList);
break;
}
return super.onOptionsItemSelected(item);
}
}
实体Info
public class Info implements Serializable {
private static final long serialVersionUID = -1010711775392052966L;
private double latitude;// 精度
private double longitude;// 纬度
private int imgId;// 图片id
private String name;// 商家名称
private String distance;// 距离
private int zan;// 点赞数量

public static List<Info> infoList = new ArrayList<>();// 演示的图片,真真的项目一般是url

// 这些数据在真真的项目都是从服务器获取
static {
infoList.add(new Info(34.242652, 108.971171, R.drawable.a01, "英伦贵族小旅馆",
"距离209米", 1456));
infoList.add(new Info(34.242952, 108.972171, R.drawable.a02, "沙井国际洗浴会所",
"距离897米", 456));
infoList.add(new Info(34.242852, 108.973171, R.drawable.a03, "五环服装城",
"距离249米", 1456));
infoList.add(new Info(34.242152, 108.971971, R.drawable.a04, "老米家泡馍小炒",
"距离679米", 1456));
}

/**
* 构造方法
*/
public Info(double latitude, double longitude, int imgId, String name,
String distance, int zan) {
this.latitude = latitude;
this.longitude = longitude;
this.imgId = imgId;
this.name = name;
this.distance = distance;
this.zan = zan;
}

public double getLatitude() {
return latitude;
}

public void setLatitude(double latitude) {
this.latitude = latitude;
}

public double getLongitude() {
return longitude;
}

public void setLongitude(double longitude) {
this.longitude = longitude;
}

public int getImgId() {
return imgId;
}

public void setImgId(int imgId) {
this.imgId = imgId;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDistance() {
return distance;
}

public void setDistance(String distance) {
this.distance = distance;
}

public int getZan() {
return zan;
}

public void setZan(int zan) {
this.zan = zan;
}

}



0 0
原创粉丝点击