Android学习笔记之使用百度地图实现地图控制
PS:吾之榮耀,離別已久.
?
學(xué)習(xí)內(nèi)容:
1.實(shí)現(xiàn)地圖控制.
2.百度地圖開發(fā)的一些細(xì)節(jié)
?
? 1.實(shí)現(xiàn)地圖控制:
? 這一篇主要寫在百度地圖上添加一些其他控制.上一篇書寫了覆蓋物的添加,地理編碼和反地理編碼,還有如何實(shí)現(xiàn)定位.那么這一篇主要是說一下實(shí)現(xiàn)地圖控制,以及一些細(xì)節(jié).由于我也是看著牛人的博客學(xué)習(xí)的.因此可能有點(diǎn)雜亂無章.
? MapView.
? 地圖控制主要是通過使用MapView類中的一些相關(guān)函數(shù)來實(shí)現(xiàn)地圖控制.這里的實(shí)現(xiàn)地圖控制主要是控制Map上的View視圖.在Map上添加或者移除一個(gè)View.控制縮放控件和比例尺控件,設(shè)置縮放控件和比例尺的相關(guān)位置.默認(rèn)的情況下,MapView是自帶縮放控件和比例尺的.
//不顯示縮放按鈕和比例尺 mapView.showZoomControls(false); mapView.showScaleControl(false);? 設(shè)置縮放控件和比例尺的相關(guān)位置
mapView.setZoomControlsPosition(new Point(150,60)); mapView.setScaleControlsPosition(new Point(150,60));? 這里還需要說明一點(diǎn)就是關(guān)于MapView的生命周期問題.MapView的生命周期和當(dāng)前的Activity是緊密關(guān)聯(lián)的.因此我們需要在Activity當(dāng)中去設(shè)置MapView的生命周期.同時(shí)在使用MapView控件的時(shí)候必須要使用SDKInitializer.initialize(Context)函數(shù)去提供全局的Context信息.
? MapView的內(nèi)部函數(shù)其實(shí)并不是非常的多.也就這么幾種View的相應(yīng)控制,以及生命周期函數(shù)的設(shè)定.例舉一下內(nèi)部的相關(guān)函數(shù).
mapView.addView(View child,LayoutParams params); //在地圖上添加子View.并設(shè)置相關(guān)的參數(shù). mapView.onDestory(); //生命周期函數(shù),當(dāng)Activity被銷毀的時(shí)候.地圖控件也被銷毀. mapView.onPause(); //生命周期函數(shù) mapView.onResume(); //生命周期函數(shù) mapView.remove(View view); //移除MapView上的View視圖. mapView.onLayout(boolean changed,int l,int t,int r,int b); //個(gè)人認(rèn)為是指定mapView的布局.官方API沒給出解釋.? BaiduMap的監(jiān)聽事件控制
? 在地圖上我們可以設(shè)置相關(guān)的監(jiān)聽函數(shù).監(jiān)聽的接口如下:
? setOnMapClickListener(OnMapClickListener)? 點(diǎn)擊函數(shù).
bdMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublic boolean onMapPoiClick(MapPoi arg0) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onMapClick(LatLng arg0) {// TODO Auto-generated method stub//設(shè)置地圖中心點(diǎn)msu = msuFactory.newLatLng(arg0);bdMap.animateMapStatus(msu);Toast.makeText(getApplicationContext(), "地圖中心點(diǎn)移動(dòng)到"+arg0.toString(), Toast.LENGTH_SHORT).show();}});? setOnMapDoubleClickListener(OnMapClickListener) 雙擊函數(shù).
bdMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener() {@Overridepublic void onMapDoubleClick(LatLng arg0) {}});? setOnMapLongClickListener(OnMapClickListener) 長(zhǎng)按函數(shù).
?setOnMapStatusChangerListener(OnMapStatusChangerListener) 地圖狀態(tài)變化的監(jiān)聽函數(shù).
?這兩個(gè)就不列舉了.主要是BaiduMap的兩個(gè)
?void animateMapStatus(MapStatusUpdate status)
?void animateMapStatus(MapStatusUpdate update int duration)
?這兩個(gè)函數(shù)表示當(dāng)?shù)貓D狀態(tài)發(fā)生變化的時(shí)候.以動(dòng)畫的形式進(jìn)行改變.第一個(gè)函數(shù)沒有指定動(dòng)畫的時(shí)間.默認(rèn)時(shí)間為300毫秒.第二個(gè)則是指定時(shí)間的動(dòng)畫.傳遞的參數(shù)則是MapStatusUpdate參數(shù).不難看出這個(gè)類的含義就是當(dāng)?shù)貓D狀態(tài)發(fā)生改變時(shí)的更新狀態(tài).需要將這個(gè)改變的狀態(tài)封裝成MapStatusUpdate對(duì)象.然后通過使用animateMapStatus()函數(shù)去完成這個(gè)變化. MapStatusUpdate是一個(gè)靜態(tài)類.因此實(shí)例化對(duì)象的方式采用MapStatusUpdateFactory工廠來完成對(duì)象的實(shí)例化. 這個(gè)類的內(nèi)部函數(shù)還是非常的多的.我們可以通過使用內(nèi)部的函數(shù)構(gòu)造出各種各樣的MapStatusUpdate對(duì)象..
? 還是傳一張圖吧.手打真?zhèn)黄?.
?縮小地圖(縮小一個(gè)級(jí)別)
msu = msuFactory.zoomOut(); bdMap.animateMapStatus(msu);?放大地圖(放大一個(gè)級(jí)別)
msu = msuFactory.zoomIn(); bdMap.animateMapStatus(msu);?設(shè)置地圖中心點(diǎn)
msu = msuFactory.newLatLng(arg0); bdMap.animateMapStatus(msu);?其他函數(shù)就不一一列舉了.我們可以看到這個(gè)類的內(nèi)部存在一個(gè)newMapStatus(MapStatus status)函數(shù).這個(gè)函數(shù)是將MapStatus封裝成MapStatusUpdate,然后通過調(diào)用animateMapStatus(msu);同樣可以完成一個(gè)地圖的狀態(tài)更新.那么就不得不說一下MapStatus了.這個(gè)類的相關(guān)函數(shù)如下:
?這個(gè)類可以設(shè)置地圖的旋轉(zhuǎn)和俯視效果.設(shè)置了相關(guān)效果之后.將MapStatus封裝成MapStatusUpdate對(duì)象.就可以實(shí)現(xiàn)旋轉(zhuǎn)和俯視效果的地圖狀態(tài)更新了.實(shí)現(xiàn)方式:
?設(shè)置了一個(gè)旋轉(zhuǎn)效果的地圖狀態(tài).
mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle +=30).build(); msu = msuFactory.newMapStatus(mapStatus); bdMap.animateMapStatus(msu);?設(shè)置了一個(gè)俯視效果的地圖狀態(tài).
mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -=10).build(); msu = msuFactory.newMapStatus(mapStatus);bdMap.animateMapStatus(msu);
?這樣通過定義MapStatus對(duì)象也能夠?qū)崿F(xiàn)一些地圖狀態(tài)的控制.最后再說一個(gè)關(guān)于地圖截圖的問題.個(gè)人感覺有點(diǎn)不是非常的使用了.現(xiàn)如今的手機(jī)都可以通過快捷鍵去直接實(shí)現(xiàn)截屏功能.這個(gè)功能就有點(diǎn)不怎么適用了.既然說了,那么還是要簡(jiǎn)單的說一下.
?實(shí)現(xiàn)地圖的截圖需要使用以下函數(shù).
?snapshot()函數(shù)..SnapshotReadyCallback()為其回調(diào)接口.截屏之后我們還可以對(duì)截取到的圖片進(jìn)行數(shù)據(jù)的保存.
bdMap.snapshot(new SnapshotReadyCallback() {@Overridepublic void onSnapshotReady(Bitmap bitmap) {// TODO Auto-generated method stubFile 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.百度地圖開發(fā)的一些其他細(xì)節(jié).
?也算是對(duì)自己昨天寫的東西進(jìn)行一些相關(guān)的補(bǔ)充.上一篇博客寫了關(guān)于定位的功能.也就是使用LocationClient去實(shí)現(xiàn)客戶端定位.同時(shí)也說了一下內(nèi)部的監(jiān)聽函數(shù).實(shí)現(xiàn)定位首先需要初始化對(duì)象.然后注冊(cè)定位監(jiān)聽.然后設(shè)置相關(guān)的定位參數(shù).最后開始定位就可以了.
?只是忘記了說另一個(gè)監(jiān)聽函數(shù):
?NotifyListener()
?注冊(cè)位置提醒監(jiān)聽.位置提醒一般表示的是我們?cè)O(shè)置了某一位置,當(dāng)我們快要到達(dá)這個(gè)位置的時(shí)候,開啟位置監(jiān)聽.可以通過振動(dòng)的方式來提示我們已經(jīng)到達(dá)了這個(gè)位置的附近.因此這個(gè)監(jiān)聽的注冊(cè)是否必要取決于我們的需求.
?并且設(shè)置了這些相關(guān)監(jiān)聽的同時(shí),我們需要在最后去釋放這些監(jiān)聽.
?釋放的方式:重寫onDestory函數(shù)去釋放.
@Override protected void onDestroy() { super.onDestroy(); mapview.onDestroy(); locationClient.unRegisterLocationListener(locationListener); //取消位置提醒 locationClient.removeNotifyEvent(notifyListener); locationClient.stop(); } class MyNotifyListener extends BDNotifyListener {@Overridepublic void onNotify(BDLocation bdLocation, float distance) {super.onNotify(bdLocation, distance);mVibrator.vibrate(1000);//振動(dòng)提醒已到設(shè)定位置附近Toast.makeText(LocationActivity.this, "震動(dòng)提醒", Toast.LENGTH_SHORT).show();}}?LocationOptions的相關(guān)補(bǔ)充.
?LocationOptions表示的是定位參數(shù).我們?cè)诙ㄎ坏臅r(shí)候可以通過設(shè)置相關(guān)的參數(shù)去完善定位.
?還要說一下這個(gè)定位模式的問題:
?1. 高精度定位模式:同時(shí)使用網(wǎng)絡(luò)定位和GPS定位,優(yōu)先返回最高精度的定位結(jié)果。
?
?2. 低功耗定位模式:不使用GPS,只使用網(wǎng)絡(luò)定位(WiFi和基站)。
?
?3. 僅用設(shè)備定位模式: 不適用網(wǎng)絡(luò)定位,只使用GPS進(jìn)行定位。但是此模式下不支持室內(nèi)環(huán)境的定位。
?LocationOptions的一些相關(guān)函數(shù):
LocationClientOption locOption = new LocationClientOption(); locOption.setLocationMode(LocationMode.Hight_Accuracy);// 設(shè)置定位模式 locOption.setCoorType("bd09ll");// 設(shè)置定位結(jié)果類型 locOption.setScanSpan(5000);// 設(shè)置發(fā)起定位請(qǐng)求的間隔時(shí)間,ms locOption.setIsNeedAddress(true);// 返回的定位結(jié)果包含地址信息 locOption.setNeedDeviceDirect(true);// 設(shè)置返回結(jié)果包含手機(jī)的方向
?還有關(guān)于定位是否能夠成功.還是發(fā)生了失敗的原因,我們可以通過使用getLocType()這個(gè)方法獲取到,返回的值為int類型.
? 通過這個(gè)值我們就可以判斷我們的定位是否成功,并且如果發(fā)生了錯(cuò)誤,我們可以通過捕捉這個(gè)int數(shù)據(jù)來判斷我們?cè)谑裁次恢蒙习l(fā)生了錯(cuò)誤.通過這個(gè)錯(cuò)誤信息我們就可以去調(diào)試.還是比較方便的.
?總體也就這么多了.最后再放上一個(gè)代碼.方便大家去研究.
?http://files.cnblogs.com/files/RGogoing/Map_1.rar
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/RGogoing/p/5037524.html
總結(jié)
以上是生活随笔為你收集整理的Android学习笔记之使用百度地图实现地图控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Solr学习总结(二)Solr的安装与配
- 下一篇: Android开发-mac上使用三星S3