天天看點

Android學習筆記之使用百度地圖實作地圖控制

PS:吾之榮耀,離别已久.

學習内容:

1.實作地圖控制.

2.百度地圖開發的一些細節

  1.實作地圖控制:

  這一篇主要寫在百度地圖上添加一些其他控制.上一篇書寫了覆寫物的添加,地理編碼和反地理編碼,還有如何實作定位.那麼這一篇主要是說一下實作地圖控制,以及一些細節.由于我也是看着牛人的部落格學習的.是以可能有點雜亂無章.

  MapView.

  地圖控制主要是通過使用MapView類中的一些相關函數來實作地圖控制.這裡的實作地圖控制主要是控制Map上的View視圖.在Map上添加或者移除一個View.控制縮放控件和比例尺控件,設定縮放控件和比例尺的相關位置.預設的情況下,MapView是自帶縮放控件和比例尺的.

//不顯示縮放按鈕和比例尺
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資訊.

  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對象..

Android學習筆記之使用百度地圖實作地圖控制

  還是傳一張圖吧.手打真傷不起..

 縮小地圖(縮小一個級别)

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了.這個類的相關函數如下:

Android學習筆記之使用百度地圖實作地圖控制

 這個類可以設定地圖的旋轉和俯視效果.設定了相關效果之後.将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的一些相關函數:

Android學習筆記之使用百度地圖實作地圖控制
LocationClientOption locOption = new LocationClientOption();
locOption.setLocationMode(LocationMode.Hight_Accuracy);// 設定定位模式
locOption.setCoorType("bd09ll");// 設定定位結果類型
locOption.setScanSpan(5000);// 設定發起定位請求的間隔時間,ms
locOption.setIsNeedAddress(true);// 傳回的定位結果包含位址資訊
locOption.setNeedDeviceDirect(true);// 設定傳回結果包含手機的方向      

 還有關于定位是否能夠成功.還是發生了失敗的原因,我們可以通過使用getLocType()這個方法擷取到,傳回的值為int類型.

Android學習筆記之使用百度地圖實作地圖控制

  通過這個值我們就可以判斷我們的定位是否成功,并且如果發生了錯誤,我們可以通過捕捉這個int資料來判斷我們在什麼位置上發生了錯誤.通過這個錯誤資訊我們就可以去調試.還是比較友善的.

 總體也就這麼多了.最後再放上一個代碼.友善大家去研究.

 http://files.cnblogs.com/files/RGogoing/Map_1.rar

轉載于:https://www.cnblogs.com/RGogoing/p/5037524.html