讀古今文學網 > Android程序設計:第2版 > MapView和MyLocationOverlay初始化 >

MapView和MyLocationOverlay初始化

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)。