1、百度地圖的初始化java
主要用到三個類:android
一、BMapManager:使用地圖sdk前需先初始化BMapManager.BMapManager是全局的,可爲多個MapView共用,它須要地圖模塊建立前建立, 並在地圖地圖模塊銷燬後銷燬,只要還有地圖模塊在使用,BMapManager就不該該銷燬。它屬於地圖引擎管理類。api
最好在用一個自定義的繼承於Application的類來依附Activity的生命週期,它有四個經常使用方法:網絡
public boolean start() //開啓百度地圖API
public boolean stop() //終止百度地圖API,調用此函數後,不會再發生回調
public void destroy() //在程序退出前調用
public boolean init(java.lang.String strKey,MKGeneralListener listener)//其中的參數:
strKey
- 申請的受權驗證碼,
- 註冊回調事件
listener
package org.hjw.hellobaidu; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.MKEvent; import android.app.Application; import android.content.Context; import android.widget.Toast; public class MapApplication extends Application { /** * 使用地圖sdk前需先初始化BMapManager. * BMapManager是全局的,可爲多個MapView共用,它須要地圖模塊建立前建立, * 並在地圖地圖模塊銷燬後銷燬,只要還有地圖模塊在使用,BMapManager就不該該銷燬 */ private static MapApplication mInstance = null; public boolean m_keyRight = true; BMapManager bMapManager = null;//地圖管理引擎 public static final String mapKey = "sEtVxB4uwzTRlchScMcELXu8"; @Override public void onCreate() { super.onCreate(); mInstance = this; initMapManager(this); } private void initMapManager(Context context) { if(bMapManager==null){ bMapManager = new BMapManager(context); } if(!bMapManager.init(mapKey, new GeneralListner())){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "BMapManager 初始化錯誤!", Toast.LENGTH_LONG).show(); } } public static MapApplication getInstance(){ return mInstance; } static class GeneralListner implements MKGeneralListener{ @Override public void onGetNetworkState(int arg0) { if(arg0 ==MKEvent.ERROR_NETWORK_CONNECT){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "網絡出錯啦!", Toast.LENGTH_LONG).show(); }else if(arg0 ==MKEvent.ERROR_NETWORK_DATA){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "請輸入正確的檢索條件!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int iError) { if(iError!=0){ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "請輸入正確Mapkey!", Toast.LENGTH_LONG).show(); MapApplication.getInstance().m_keyRight=false; }else{ Toast.makeText(MapApplication.getInstance().getApplicationContext(), "MapKey認證成功!", Toast.LENGTH_LONG).show(); MapApplication.getInstance().m_keyRight=true; } } } }
二、MapView類:它直接繼承於ViewGroup,顯示地圖的View,一個顯示地圖的視圖,當被焦點選中時,它能捕獲按鍵事件和觸摸手勢去平移和縮放地圖。app
MapView的生命週期與Activity同步,當activity掛起時需調用MapView.onPause()。必須在setContentview後纔可使用mapView,同時也包含了對覆蓋物的管理等。
三、MapController類:它是地圖控制器,經過mapView對象得到,同時也取得了對mapView的各類操做權限,包括縮放大小,顯示不一樣類型的圖等等。
四、MKMapViewListener接口:地圖顯示事件監聽器。 該接口監聽地圖顯示事件,用戶須要實現該接口以處理相應事件,包含下面四個方法。
{ide
void onClickMapPoi(MapPoi mapPoiInfo)函數
點擊到地圖可點標註時會回調此接口字體
void onGetCurrentMap(Bitmap b)動畫
截圖成功後會回調此接口this
void onMapAnimationFinish()
動畫結束時會回調此消息
void onMapLoadFinish()
在圖加載完成回調
}
void onMapMoveFinish()
地圖移動完成時會回調此接口
重寫方法時,必須經過mapView對象註冊監聽器。
mapView.regMapViewListener(MapApplication.getInstance().bMapManager,mkMapViewListener);// 用戶註冊地圖監聽器
2、文字覆蓋物的實現
分爲如下幾步:
1. 用TextItem準備文字數據
2. 建立TextOverlay,調用 addText(TextItem) 接口添加文字.
3. 調用MapView.getOverlays().add()方法添加overlay到mapview中。
4. 調用MapView.refresh() 使Overlay生效。
實現代碼:
TextItem textItem = new TextItem(); textItem.fontColor = textColor1; //textItem.bgColor = textColor1; textItem.fontSize = 20; textItem.text = "這裏是中心廣場"; textItem.pt = mapView.getMapCenter(); TextOverlay textOverlay = new TextOverlay(mapView); textOverlay.addText(textItem); mapView.getOverlays().add(textOverlay); mapView.refresh();
其中對於TextItem類中的fontColor和fontSize是必須賦值的,不然地圖上面會看不到的。
下面是效果圖:
那個很小的」這裏是中心廣場」就是覆蓋物,所以需適量調整字體大小。其中TextItem中的fontSize和fontColor是必需要設置的,這是在百度sdk2.0以後才須要這樣,2.0以前都是直接繼承基類Overlay重寫Draw方法。
還有一點就是官方提供的Demo裏面,GeoPoint的初始化,參數分別爲緯度和經度,Demo裏面弄反了,因此可能會致使地圖顯示空白,只有小格子。這個問題糾結了很久。