PS:吾之榮耀,離別已久.網絡
學習內容:ide
1.實現地圖控制.函數
2.百度地圖開發的一些細節佈局
1.實現地圖控制:學習
這一篇主要寫在百度地圖上添加一些其餘控制.上一篇書寫了覆蓋物的添加,地理編碼和反地理編碼,還有如何實現定位.那麼這一篇主要是說一下實現地圖控制,以及一些細節.因爲我也是看着牛人的博客學習的.所以可能有點雜亂無章.動畫
MapView.ui
地圖控制主要是經過使用MapView類中的一些相關函數來實現地圖控制.這裏的實現地圖控制主要是控制Map上的View視圖.在Map上添加或者移除一個View.控制縮放控件和比例尺控件,設置縮放控件和比例尺的相關位置.默認的狀況下,MapView是自帶縮放控件和比例尺的.this
//不顯示縮放按鈕和比例尺 mapView.showZoomControls(false); mapView.showScaleControl(false);
設置縮放控件和比例尺的相關位置編碼
mapView.setZoomControlsPosition(new Point(150,60)); mapView.setScaleControlsPosition(new Point(150,60));
這裏還須要說明一點就是關於MapView的生命週期問題.MapView的生命週期和當前的Activity是緊密關聯的.所以咱們須要在Activity當中去設置MapView的生命週期.同時在使用MapView控件的時候必需要使用SDKInitializer.initialize(Context)函數去提供全局的Context信息.spa
MapView的內部函數其實並非很是的多.也就這麼幾種View的相應控制,以及生命週期函數的設定.例舉一下內部的相關函數.
mapView.addView(View child,LayoutParams params); //在地圖上添加子View.並設置相關的參數. mapView.onDestory(); //生命週期函數,當Activity被銷燬的時候.地圖控件也被銷燬. mapView.onPause(); //生命週期函數 mapView.onResume(); //生命週期函數 mapView.remove(View view); //移除MapView上的View視圖. mapView.onLayout(boolean changed,int l,int t,int r,int b); //我的認爲是指定mapView的佈局.官方API沒給出解釋.
BaiduMap的監聽事件控制
在地圖上咱們能夠設置相關的監聽函數.監聽的接口以下:
setOnMapClickListener(OnMapClickListener) 點擊函數.
bdMap.setOnMapClickListener(new OnMapClickListener() { @Override public boolean onMapPoiClick(MapPoi arg0) { // TODO Auto-generated method stub return false; } @Override public void onMapClick(LatLng arg0) { // TODO Auto-generated method stub //設置地圖中心點 msu = msuFactory.newLatLng(arg0); bdMap.animateMapStatus(msu); Toast.makeText(getApplicationContext(), "地圖中心點移動到"+arg0.toString(), Toast.LENGTH_SHORT).show(); } });
setOnMapDoubleClickListener(OnMapClickListener) 雙擊函數.
bdMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener() { @Override public void onMapDoubleClick(LatLng arg0) { } });
setOnMapLongClickListener(OnMapClickListener) 長按函數.
setOnMapStatusChangerListener(OnMapStatusChangerListener) 地圖狀態變化的監聽函數.
這兩個就不列舉了.主要是BaiduMap的兩個
void animateMapStatus(MapStatusUpdate status)
void animateMapStatus(MapStatusUpdate update int duration)
這兩個函數表示當地圖狀態發生變化的時候.以動畫的形式進行改變.第一個函數沒有指定動畫的時間.默認時間爲300毫秒.第二個則是指定時間的動畫.傳遞的參數則是MapStatusUpdate參數.不難看出這個類的含義就是當地圖狀態發生改變時的更新狀態.須要將這個改變的狀態封裝成MapStatusUpdate對象.而後經過使用animateMapStatus()函數去完成這個變化. MapStatusUpdate是一個靜態類.所以實例化對象的方式採用MapStatusUpdateFactory工廠來完成對象的實例化. 這個類的內部函數仍是很是的多的.咱們能夠經過使用內部的函數構造出各類各樣的MapStatusUpdate對象..
仍是傳一張圖吧.手打真傷不起..
縮小地圖(縮小一個級別)
msu = msuFactory.zoomOut();
bdMap.animateMapStatus(msu);
放大地圖(放大一個級別)
msu = msuFactory.zoomIn();
bdMap.animateMapStatus(msu);
設置地圖中心點
msu = msuFactory.newLatLng(arg0);
bdMap.animateMapStatus(msu);
其餘函數就不一一列舉了.咱們能夠看到這個類的內部存在一個newMapStatus(MapStatus status)函數.這個函數是將MapStatus封裝成MapStatusUpdate,而後經過調用animateMapStatus(msu);一樣能夠完成一個地圖的狀態更新.那麼就不得不說一下MapStatus了.這個類的相關函數以下:
這個類能夠設置地圖的旋轉和俯視效果.設置了相關效果以後.將MapStatus封裝成MapStatusUpdate對象.就能夠實現旋轉和俯視效果的地圖狀態更新了.實現方式:
設置了一個旋轉效果的地圖狀態.
mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle +=30).build(); msu = msuFactory.newMapStatus(mapStatus); bdMap.animateMapStatus(msu);
設置了一個俯視效果的地圖狀態.
mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -=10).build(); msu = msuFactory.newMapStatus(mapStatus);
bdMap.animateMapStatus(msu);
這樣經過定義MapStatus對象也可以實現一些地圖狀態的控制.最後再說一個關於地圖截圖的問題.我的感受有點不是很是的使用了.現現在的手機均可以經過快捷鍵去直接實現截屏功能.這個功能就有點不怎麼適用了.既然說了,那麼仍是要簡單的說一下.
實現地圖的截圖須要使用如下函數.
snapshot()函數..SnapshotReadyCallback()爲其回調接口.截屏以後咱們還能夠對截取到的圖片進行數據的保存.
bdMap.snapshot(new SnapshotReadyCallback() { @Override public void onSnapshotReady(Bitmap bitmap) { // TODO Auto-generated method stub File file = new File("/mnt/sdcard/test.png"); FileOutputStream fos = null; try { fos = new FileOutputStream(file); if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)){ fos.flush(); fos.close(); } Toast.makeText(MapControllActivity.this,"屏幕截圖成功,圖片存在: " + file.toString(),Toast.LENGTH_SHORT).show(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } });
2.百度地圖開發的一些其餘細節.
也算是對本身昨天寫的東西進行一些相關的補充.上一篇博客寫了關於定位的功能.也就是使用LocationClient去實現客戶端定位.同時也說了一下內部的監聽函數.實現定位首先須要初始化對象.而後註冊定位監聽.而後設置相關的定位參數.最後開始定位就能夠了.
只是忘記了說另外一個監聽函數:
NotifyListener()
註冊位置提醒監聽.位置提醒通常表示的是咱們設置了某一位置,當咱們快要到達這個位置的時候,開啓位置監聽.能夠經過振動的方式來提示咱們已經到達了這個位置的附近.所以這個監聽的註冊是否必要取決於咱們的需求.
而且設置了這些相關監聽的同時,咱們須要在最後去釋放這些監聽.
釋放的方式:重寫onDestory函數去釋放.
@Override protected void onDestroy() { super.onDestroy(); mapview.onDestroy(); locationClient.unRegisterLocationListener(locationListener); //取消位置提醒 locationClient.removeNotifyEvent(notifyListener); locationClient.stop(); }
class MyNotifyListener extends BDNotifyListener { @Override public void onNotify(BDLocation bdLocation, float distance) { super.onNotify(bdLocation, distance); mVibrator.vibrate(1000);//振動提醒已到設定位置附近 Toast.makeText(LocationActivity.this, "震動提醒", Toast.LENGTH_SHORT).show(); } }
LocationOptions的相關補充.
LocationOptions表示的是定位參數.咱們在定位的時候能夠經過設置相關的參數去完善定位.
還要說一下這個定位模式的問題:
1. 高精度定位模式:同時使用網絡定位和GPS定位,優先返回最高精度的定位結果。
2. 低功耗定位模式:不使用GPS,只使用網絡定位(WiFi和基站)。
3. 僅用設備定位模式: 不適用網絡定位,只使用GPS進行定位。可是此模式下不支持室內環境的定位。
LocationOptions的一些相關函數:
LocationClientOption locOption = new LocationClientOption(); locOption.setLocationMode(LocationMode.Hight_Accuracy);// 設置定位模式 locOption.setCoorType("bd09ll");// 設置定位結果類型 locOption.setScanSpan(5000);// 設置發起定位請求的間隔時間,ms locOption.setIsNeedAddress(true);// 返回的定位結果包含地址信息 locOption.setNeedDeviceDirect(true);// 設置返回結果包含手機的方向
還有關於定位是否可以成功.仍是發生了失敗的緣由,咱們能夠經過使用getLocType()這個方法獲取到,返回的值爲int類型.
經過這個值咱們就能夠判斷咱們的定位是否成功,而且若是發生了錯誤,咱們能夠經過捕捉這個int數據來判斷咱們在什麼位置上發生了錯誤.經過這個錯誤信息咱們就能夠去調試.仍是比較方便的.
整體也就這麼多了.最後再放上一個代碼.方便你們去研究.
http://files.cnblogs.com/files/RGogoing/Map_1.rar