废话少说,直接上代码:
MapActivity.java
package com.wissea.trs.activity;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.wissea.trs.R;
import com.wissea.trs.model.CameraLocation;
public class MapActivity extends BaseActivity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private BitmapDescriptor mMarker;
private RelativeLayout rl_camera_description;
private Context mContext;
private TextView tv_name;
private TextView tv_description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
mContext = getApplicationContext();
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_map);
// 模拟数据
List<CameraLocation> cameraLocations = new ArrayList<CameraLocation>();
cameraLocations.add(new CameraLocation(34.242652,108.971171,R.drawable.logo,"英伦贵族东旅馆", "距离209米","我是说明1"));
cameraLocations.add(new CameraLocation(34.242952,108.972171,R.drawable.logo,"英伦贵族西旅馆", "距离209米","我是说明2"));
cameraLocations.add(new CameraLocation(34.242852,108.973171,R.drawable.logo,"英伦贵族南旅馆", "距离209米","我是说明3"));
cameraLocations.add(new CameraLocation(34.242152,108.971971,R.drawable.logo,"英伦贵族北旅馆", "距离209米","我是说明4"));
initView();
initMarker(cameraLocations);
}
/**
* 初始化控件
*/
private void initView() {
// 初始化ActionBar
setBackable(true);
setTitle("拓扑图");
// 获取地图控件引用
mMapView = (MapView) findViewById(R.id.mv_map);
mBaiduMap = mMapView.getMap();
// 底部说明
rl_camera_description = (RelativeLayout) findViewById(R.id.rl_camera_description);
tv_name = (TextView) findViewById(R.id.tv_name);
tv_description = (TextView) findViewById(R.id.tv_description);
}
/**
* 点击地图上的标记
* @param cameraLocations
*/
private void initMarker(List<CameraLocation> cameraLocations) {
// TODO Auto-generated method stub
mMarker = BitmapDescriptorFactory.fromResource(R.drawable.marker);
mBaiduMap.clear();
LatLng latLng = null;
Marker marker = null;
OverlayOptions options;
for(CameraLocation cameraLocation : cameraLocations) {
// 经纬度
latLng = new LatLng(cameraLocation.getLatitude(), cameraLocation.getLongtitude());
// 图标
options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);
marker = (Marker) mBaiduMap.addOverlay(options);
Bundle bundle = new Bundle();
bundle.putSerializable("cameraLocation", cameraLocation);
marker.setExtraInfo(bundle);
}
// 定义地图状态(精确到50米)
MapStatus mMapStatus = new MapStatus.Builder().target(latLng).zoom(18).build();
// 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
// 移到第四个位置
mBaiduMap.setMapStatus(mapStatusUpdate);
// 点击地图上的标记
mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Bundle bundle = marker.getExtraInfo();
CameraLocation cameraLocation = (CameraLocation) bundle.getSerializable("cameraLocation");
//rl_camera_description.findViewById(id)查找该相对布局里的控件,使用cameraLocation这个bean的信息为控件设置内容
tv_name.setText(cameraLocation.getName());
tv_description.setText(cameraLocation.getDescription());
InfoWindow infoWindow;
TextView textView = new TextView(mContext);
textView.setBackgroundResource(R.drawable.popup);
textView.setPadding(30, 20, 30, 50);
textView.setText("haha");
textView.setTextColor(getResources().getColor(R.color.black));
final LatLng latLng = marker.getPosition();
Point point = mBaiduMap.getProjection().toScreenLocation(latLng);
point.y -= 160;
LatLng latLng2 = mBaiduMap.getProjection().fromScreenLocation(point);
infoWindow = new InfoWindow(textView, latLng2, 0);
// 以上可以替换为:infoWindow = new InfoWindow(textView, latLng, -160);
mBaiduMap.showInfoWindow(infoWindow);
rl_camera_description.setVisibility(View.VISIBLE);
return true;
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
xml文件activity_map.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.baidu.mapapi.map.MapView
android:id="@+id/mv_map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
<!-- 底部说明 -->
<RelativeLayout
android:id="@+id/rl_camera_description"
android:layout_width="match_parent"
android:layout_height="220dp"
android:background="#cc4e5a6b"
android:visibility="gone"
android:layout_alignParentBottom="true" >
<!-- 图片 -->
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_margin="12dp"
android:background="@drawable/shape_image_frame"
android:scaleType="fitXY"
android:src="@drawable/camera" />
<!-- 图片下面的说明 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="20dp"
android:gravity="center_vertical"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"
android:textColor="@color/white" />
<TextView
android:id="@+id/tv_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="description"
android:textColor="@color/white" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="20dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="aa"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="bb"
android:textColor="@color/white" />
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
CameraLocation.java
package com.wissea.trs.model;
import java.io.Serializable;
public class CameraLocation implements Serializable {
private static final long serialVersionUID = -7272905486020904055L;
private double latitude;
private double longtitude;
private int imageId;
private String name;
private String distance;
private String description;
public CameraLocation(){}
public CameraLocation(double latitude, double longtitude, int imageId,
String name, String distance, String description) {
super();
this.latitude = latitude;
this.longtitude = longtitude;
this.imageId = imageId;
this.name = name;
this.distance = distance;
this.description = description;
}
/**
* @return the latitude
*/
public double getLatitude() {
return latitude;
}
/**
* @param latitude
* the latitude to set
*/
public void setLatitude(double latitude) {
this.latitude = latitude;
}
/**
* @return the longtitude
*/
public double getLongtitude() {
return longtitude;
}
/**
* @param longtitude
* the longtitude to set
*/
public void setLongtitude(double longtitude) {
this.longtitude = longtitude;
}
/**
* @return the imageId
*/
public int getImageId() {
return imageId;
}
/**
* @param imageId
* the imageId to set
*/
public void setImageId(int imageId) {
this.imageId = imageId;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the distance
*/
public String getDistance() {
return distance;
}
/**
* @param distance
* the distance to set
*/
public void setDistance(String distance) {
this.distance = distance;
}
/**
* @return the description
*/
public String getDescription() {
return description;
}
/**
* @param description
* the description to set
*/
public void setDescription(String description) {
this.description = description;
}
}
底部的说明背景色:shape_image_frame.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<stroke
android:width="2dp"
android:color="#AAFFFFFF" />
<padding
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp" />
</shape>
运行效果: