MicroJobs中的地圖包含兩種模式:
·在啟動時,如果我們在Spinner中選擇的是Current Location,則我們希望可以顯示當前位置的地圖,並跟蹤自己的移動記錄。在這個地圖中,我們使用MyLocationOverlay類。
·當我們在Spinner中選擇了特定的位置時,我們希望只顯示這個位置的地圖,關閉位置更新,不需要跟蹤自己的位置。
我們一起來看MicroJobs.java的代碼,它對MapView執行初始化,並跟蹤定位我們的當前位置:
@Override public void onCreate(Bundle savedInstanceState) { // code elided... mvMap = (MapView) findViewById(R.id.mapmain); 1 // get the map controller final MapController mc = mvMap.getController; 2 mMyLocationOverlay = new MyLocationOverlay(this, mvMap); 3 mMyLocationOverlay.enable MyLocation; mMyLocationOverlay.runOnFirstFix( 4 new Runnable { @Override public void run { mc.animateTo(mMyLocationOverlay.getMyLocation); 5 mc.setZoom(16); } }); Drawable marker = getResources.getDrawable(R.drawable.android_tiny_image); 6 marker.setBounds(0, 0, marker.getIntrinsicWidth, marker.getIntrinsicHeight); mvMap.getOverlays.add(new MJJobsOverlay(marker)); mvMap.setClickable(true); 7 mvMap.setEnabled(true); mvMap.setSatellite(false); mvMap.setTraffic(false); mvMap.setStreetView(false); // start out with a general zoom mc.setZoom(16); 8 // code elided... } /* Required method to indicate whether we display routes */ @Override protected boolean isRouteDisplayed { return false; } 9
以下是一些重點代碼的解釋:
1 首先,在main.xml佈局文件中的MapView和其他視圖的查找方式完全相同,它被賦給變量mvMap,其類型是MapView,需要的時候可以使用這個變量。
2 在MapController上獲取和MapView關聯的handle。這裡將使用這個handle來(動態)拖放地圖,執行縮小、放大等操作。
3 為了使用MyLocationOverlay,這裡創建了一個新的實例mMyLocationOverlay。
4 在mMyLocationOverlay實例中,做的第一件事情是定義了一個方法,當從位置供應商處接收到第一個位置修復時,Android會調用該方法。
5 這個runOnFirstFix方法把地圖移動到當前位置(通過mMyLocationOverlay.getMyLocation獲取)並放大到合理尺寸使我們能夠看到其附近的工作信息。
6 下一步,在mMyLocationOverlay中標識出可用的工作信息。這裡使用了保存在res/drawable目錄下的圖像android_tiny_image。該圖像是一個小小的Android機器人。還定義了Drawable的邊界,並把標記覆蓋圖添加到MapView mvMap的列表中。
7 下面,將為myMap設置一些初始屬性,這些屬性隨後就會介紹。這裡將允許用戶通過菜單按鈕更改大多數屬性。
8 然後,為了避免地理位置提供商觸發runOnFirstFix,會重新設置縮放級別。
9 最後,MapView要求我們覆蓋isRouteDisplayed方法,以表示我們是否在地圖上顯示路由信息。因為在這個例子中沒有顯示路由信息,所以返回false。
MyLocationOverlay封裝了很多地理位置和地圖編碼。在調用構造函數時,需要執行下述操作:
·讓Android識別出環境中有哪些可用的地理位置provider(GPS、Cell ID和三角區等)。
·連接到這些地理位置提供者。
·隨著手機移動,讓地理位置提供者週期性地更新地理位置信息。
·連接到路由中,它會根據需要自動移動地圖來追蹤地理位置任何變化。
MyLocationOverlay還支持在MapView上放置一個指南針,並更新該指南針。但是在MJAndroid中不會使用該指南針。
在代碼中設置的地圖屬性如下:
setClickable
我們希望用戶按下job選項卡,MJAndroid可以顯示關於該job的更多信息,因此把該屬性設置成true。
setEnabled
該方法實際上是從android.view.View中繼承來的。Google沒有明確地說明該參數在MapView中的含義,但是猜想它應該是啟用地圖的標準功能——放大、縮小、拖曳等。
setSatellite
設置該標記會在組合地圖中增加衛星視圖,但是清除該標記會刪除該視圖。剛開始,我們希望不要顯示衛星地圖。
setTraffic
同樣,設置或清除該標記會在地圖上增加或刪除當前的交通信息。同樣,我們也希望剛開始不要顯示交通信息。
setStreetView
我們現在也不想要街道視圖,雖然在後面將會支持用戶啟用這個視圖。
Android地圖的縮放功能
Android地圖支持縮小和放大。「i」鍵對地圖進行縮小,而「o」鍵對地圖放大。程序可以通過MapController控制地圖縮小和放大。
關於縮小和放大,定義了一些方法,它們都依賴於MapController。Android為地圖定義了21級的縮放級別。在縮放級別1,地球赤道長是256個像素。每增加一個縮放級別,顯示的像素數就是原來的兩倍。Google提示不支持更高級別的高清地圖顯示。所有超出限制的級別縮放方法還是會回到級別1~21。
控制縮放的方法及其參數如下:
zoomIn
縮小1個級別
zoomOut
放大1個級別
setZoom(int zoomlevel)
縮放到給定級別,級別的取值範圍是1~21
zoomInFixing(int xpixel,int ypixel),zoomOutFixing(int xpixel,int ypixel)
縮小一個級別,並保持屏幕上某個位置固定。通常情況下,當執行縮小和放大時,默認情況下屏幕中心是唯一固定點。該函數支持在地圖上以任何點為固定點。
zoomToSpan(int latSpanE6,int longSpanE6)
為了在地圖上支持拖曳而執行的縮放。其真正執行的是選擇的縮放級別,從而和請求的拖曳匹配最佳。維度和經度拖曳參數表示成實際值的10 6倍。例如,維度/經度拖曳2.5×1.0,則在該函數中將表示成zoomToSpan(2500000,1000000)。