百度地图之添加覆盖物并响应事件

来源:互联网 发布:0信誉淘宝店铺 在哪买 编辑:程序博客网 时间:2024/05/17 04:17

本文中将介绍在百度地图上添加覆盖物的功能、响应点击功能和弹出pop功能,代码来自百度Demo:

Activity:

package com.home;import java.util.ArrayList;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.map.ItemizedOverlay;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.OverlayItem;import com.baidu.mapapi.map.PopupClickListener;import com.baidu.mapapi.map.PopupOverlay;import com.baidu.platform.comapi.basestruct.GeoPoint;/** * 演示覆盖物的用法 */public class OverlayActivity 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;@Overridepublic 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中 注意: 同一个item只能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() {@Overridepublic 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 overlaymOverlay.addItem(mItems);mMapView.refresh();}@Overrideprotected void onPause() {/** * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause() */mMapView.onPause();super.onPause();}@Overrideprotected void onResume() {/** * MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume() */mMapView.onResume();super.onResume();}@Overrideprotected void onDestroy() {/** * MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy() */mMapView.destroy();super.onDestroy();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mMapView.onSaveInstanceState(outState);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);mMapView.onRestoreInstanceState(savedInstanceState);}public class MyOverlay extends ItemizedOverlay {public MyOverlay(Drawable defaultMarker, MapView mapView) {super(defaultMarker, mapView);}@Overridepublic 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.LayoutParamsMapView.LayoutParams.WRAP_CONTENT,// 控件高,继承自ViewGroup.LayoutParamsMapView.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;}@Overridepublic boolean onTap(GeoPoint pt, MapView mMapView) {if (pop != null) {pop.hidePop();mMapView.removeView(button);}return false;}}}

地图工具类(BMapUtil)同上文。
custom_text_view.xml同上文。

配置文件及Application类均与之前的一样。

布局文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/clear"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_marginBottom="2dip"            android:layout_marginLeft="2dip"            android:layout_marginRight="2dip"            android:layout_marginTop="2dip"            android:layout_weight="1"            android:background="@drawable/button_style"            android:onClick="clearOverlay"            android:padding="10dip"            android:text="清除(clear)" />        <Button            android:id="@+id/resert"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_marginBottom="2dip"            android:layout_marginLeft="2dip"            android:layout_marginRight="2dip"            android:layout_marginTop="2dip"            android:layout_weight="1"            android:background="@drawable/button_style"            android:onClick="resetOverlay"            android:text="重置(reset)" />    </LinearLayout>    <com.baidu.mapapi.map.MapView        android:id="@+id/bmapView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clickable="true" /></LinearLayout>

附上图片效果:


 

原创粉丝点击