public class OverlayDemo extends Activity {
/**
* MapView 是地图主控件
*/
private MapView mMapView = null;
/**
* 用MapController完成地图控制
*/
private MapController mMapController = null;
private MyOverlay mOverlay = null;
private PopupOverlay pop = null;
private ArrayList<OverlayItem> mItems = null;
private TextView popupText = null;
private View viewCache = null;
private View popupInfo = null;
private View popupLeft = null;
private View popupRight = null;
private Button button = null;
private MapView.LayoutParams layoutParam = null;
private OverlayItem mCurItem = null;
/**
* overlay 位置坐标
*/
double mLon1 = 116.400244 ;
double mLat1 = 39.963175 ;
double mLon2 = 116.369199;
double mLat2 = 39.942821;
double mLon3 = 116.425541;
double mLat3 = 39.939723;
double mLon4 = 116.401394;
double mLat4 = 39.906965;
double mLon5 = 116.402096;
double mLat5 = 39.942057;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 使用地图sdk前需先初始化BMapManager.
* BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
* 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
*/
DemoApplication app = (DemoApplication)this.getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(this);
/**
* 如果BMapManager没有初始化则初始化BMapManager
*/
app.mBMapManager.init(DemoApplication.strKey,new DemoApplication.MyGeneralListener());
}
/**
* 由于MapView在setContentView()中初始化,所以它需要在BMapManager初始化之后
*/
setContentView(R.layout.activity_overlay);
mMapView = (MapView)findViewById(R.id.bmapView);
/**
* 获取地图控制器
*/
mMapController = mMapView.getController();
/**
* 设置地图是否响应点击事件 .
*/
mMapController.enableClick(true);
/**
* 设置地图缩放级别
*/
mMapController.setZoom(14);
/**
* 显示内置缩放控件
*/
mMapView.setBuiltInZoomControls(true);
initOverlay();
/**
* 设定地图中心点
*/
GeoPoint p = new GeoPoint((int)(mLat5 * 1E6), (int)(mLon5* 1E6));
mMapController.setCenter(p);
}
public void initOverlay(){
/**
* 创建自定义overlay
*/
mOverlay = new MyOverlay(getResources().getDrawable(R.drawable.icon_marka),mMapView);
/**
* 准备overlay 数据
*/
GeoPoint p1 = new GeoPoint ((int)(mLat1*1E6),(int)(mLon1*1E6));
OverlayItem item1 = new OverlayItem(p1,"覆盖物1","");
/**
* 设置overlay图标,如不设置,则使用创建ItemizedOverlay时的默认图标.
*/
item1.setMarker(getResources().getDrawable(R.drawable.icon_marka));
GeoPoint p2 = new GeoPoint ((int)(mLat2*1E6),(int)(mLon2*1E6));
OverlayItem item2 = new OverlayItem(p2,"覆盖物2","");
item2.setMarker(getResources().getDrawable(R.drawable.icon_markb));
GeoPoint p3 = new GeoPoint ((int)(mLat3*1E6),(int)(mLon3*1E6));
OverlayItem item3 = new OverlayItem(p3,"覆盖物3","");
item3.setMarker(getResources().getDrawable(R.drawable.icon_markc));
GeoPoint p4 = new GeoPoint ((int)(mLat4*1E6),(int)(mLon4*1E6));
OverlayItem item4 = new OverlayItem(p4,"覆盖物4","");
item4.setMarker(getResources().getDrawable(R.drawable.icon_markd));
GeoPoint p5 = new GeoPoint ((int)(mLat5*1E6),(int)(mLon5*1E6));
OverlayItem item5 = new OverlayItem(p5,"覆盖物5","");
item5.setMarker(getResources().getDrawable(R.drawable.icon_gcoding));
/**
* 将item 添加到overlay中
* 注意: 同一个itme只能add一次
*/
mOverlay.addItem(item1);
mOverlay.addItem(item2);
mOverlay.addItem(item3);
mOverlay.addItem(item4);
mOverlay.addItem(item5);
/**
* 保存所有item,以便overlay在reset后重新添加
*/
mItems = new ArrayList<OverlayItem>();
mItems.addAll(mOverlay.getAllItem());
/**
* 将overlay 添加至MapView中
*/
mMapView.getOverlays().add(mOverlay);
/**
* 刷新地图
*/
mMapView.refresh();
/**
* 向地图添加自定义View.
*/
viewCache = getLayoutInflater().inflate(R.layout.custom_text_view, null);
popupInfo = (View) viewCache.findViewById(R.id.popinfo);
popupLeft = (View) viewCache.findViewById(R.id.popleft);
popupRight = (View) viewCache.findViewById(R.id.popright);
popupText =(TextView) viewCache.findViewById(R.id.textcache);
button = new Button(this);
button.setBackgroundResource(R.drawable.popup);
/**
* 创建一个popupoverlay
*/
PopupClickListener popListener = new PopupClickListener(){
@Override
public void onClickedPopup(int index) {
if ( index == 0){
//更新item位置
pop.hidePop();
GeoPoint p = new GeoPoint(mCurItem.getPoint().getLatitudeE6()+5000,
mCurItem.getPoint().getLongitudeE6()+5000);
mCurItem.setGeoPoint(p);
mOverlay.updateItem(mCurItem);
mMapView.refresh();
}
else if(index == 2){
//更新图标
mCurItem.setMarker(getResources().getDrawable(R.drawable.nav_turn_via_1));
mOverlay.updateItem(mCurItem);
mMapView.refresh();
}
}
};
pop = new PopupOverlay(mMapView,popListener);
}
/**
* 清除所有Overlay
* @param view
*/
public void clearOverlay(View view){
mOverlay.removeAll();
if (pop != null){
pop.hidePop();
}
mMapView.removeView(button);
mMapView.refresh();
}
/**
* 重新添加Overlay
* @param view
*/
public void resetOverlay(View view){
clearOverlay(null);
//重新add overlay
mOverlay.addItem(mItems);
mMapView.refresh();
}
@Override
protected void onPause() {
/**
* MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
*/
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
/**
* MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
*/
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
/**
* MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
*/
mMapView.destroy();
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
public class MyOverlay extends ItemizedOverlay{
public MyOverlay(Drawable defaultMarker, MapView mapView) {
super(defaultMarker, mapView);
}
@Override
public boolean onTap(int index){
OverlayItem item = getItem(index);
mCurItem = item ;
if (index == 4){
button.setText("这是一个系统控件");
GeoPoint pt = new GeoPoint ((int)(mLat5*1E6),(int)(mLon5*1E6));
//创建布局参数
layoutParam = new MapView.LayoutParams(
//控件宽,继承自ViewGroup.LayoutParams
MapView.LayoutParams.WRAP_CONTENT,
//控件高,继承自ViewGroup.LayoutParams
MapView.LayoutParams.WRAP_CONTENT,
//使控件固定在某个地理位置
pt,
0,
-32,
//控件对齐方式
MapView.LayoutParams.BOTTOM_CENTER);
//添加View到MapView中
mMapView.addView(button,layoutParam);
}
else{
popupText.setText(getItem(index).getTitle());
Bitmap[] bitMaps={
BMapUtil.getBitmapFromView(popupLeft),
BMapUtil.getBitmapFromView(popupInfo),
BMapUtil.getBitmapFromView(popupRight)
};
pop.showPopup(bitMaps,item.getPoint(),32);
}
return true;
}
@Override
public boolean onTap(GeoPoint pt , MapView mMapView){
if (pop != null){
pop.hidePop();
mMapView.removeView(button);
}
return false;
}
}
}
activity_overlay.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/clear"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
android:background="@drawable/button_style"
android:onClick="clearOverlay"
android:padding="10dip"
android:text="清除(clear)" />
<Button
android:id="@+id/resert"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:layout_marginLeft="2dip"
android:layout_marginRight="2dip"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
android:background="@drawable/button_style"
android:onClick="resetOverlay"
android:text="重置(reset)" />
</LinearLayout>
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:clickable="true"
/>
</LinearLayout>
custom_text_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/popleft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/popup_side"
android:gravity="center"
android:textStyle="bold"
android:textColor="#3814ed"
android:text="更新位置"
android:textSize="12sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/popinfo"
>
<TextView
android:id="@+id/textcache"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/popup_middle"
android:gravity="center"
android:textStyle="bold"
android:textColor="@android:color/black"
android:textSize="12sp" />
<TextView
android:id="@+id/popdown"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/popup_down"
android:textColor="@android:color/black"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:id="@+id/popright"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/popup_side"
android:textColor="#3814ed"
android:gravity="center"
android:textStyle="bold"
android:text="更新marker"
android:textSize="12sp" />
</LinearLayout>