facebook廣告





123

2017年1月29日 星期日

地圖物件

https://developers.google.com/maps/documentation/android-api/map?hl=zh-tw

地圖物件

地圖是在 API 中是由 GoogleMap 與 MapFragment 類別代表。

新增地圖到 Android 應用程式

新增地圖的基本步驟如下:
  1. (您只需要執行此步驟一次)。依照專案設定指南中的步驟執行以取得 API,取得金鑰並將必要的屬性新增至您的 Android 宣示說明。
  2. 將 Fragment 物件新增到將會處理地圖的 Activity。 最簡單的執行方式是將 <fragment> 元素新增到 Activity 的版面配置檔案。
  3. 實作 OnMapReadyCallback 介面並使用 onMapReady(GoogleMap) 回呼方法取得GoogleMap 物件的控制代碼。 GoogleMap 物件是地圖本身的內部呈現方式。 如果要設定地圖的檢視選項,您可以修改地圖的 GoogleMap 物件。
  4. 呼叫片段上的 getMapAsync() 以註冊回呼。
以下是每個步驟更詳細的資料。

新增片段

將 <fragment> 元素新增到活動的版面配置檔案,以定義 Fragment 物件。 在此元素中,將 android:name 屬性設定為 "com.google.android.gms.maps.MapFragment"。 這會自動將 MapFragment 附加到活動。
下列版面配置檔案包含 <fragment> 元素:
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android"     android:name="com.google.android.gms.maps.MapFragment"     android:id="@+id/map"     android:layout_width="match_parent"     android:layout_height="match_parent"/>
您也可以在程式碼中將 MapFragment 新增到 Activity。 如果要這樣做,請建立新的 MapFragment 實例,然後呼叫 FragmentTransaction.add() 以將 Fragment 新增到目前的 Activity
 mMapFragment = MapFragment.newInstance();  FragmentTransaction fragmentTransaction =          getFragmentManager().beginTransaction();  fragmentTransaction.add(R.id.my_container, mMapFragment);  fragmentTransaction.commit();

新增地圖程式碼

如果要使用您的應用程式內的地圖,您必須實作 OnMapReadyCallback 介面,並針對 MapFragment 或 MapView 物件設定回呼的實例。本教學課程使用 MapFragment,因為這是新增地圖到應用程式最常見的方法 。第一個步驟是實作回呼介面:
public class MainActivity extends FragmentActivity     implements OnMapReadyCallback { ... }
在 Activity 的 onCreate() 方法中,將版面配置檔案設定為內容檢視。 例如,如果版面配置檔案的名稱是 main.xml,請使用此程式碼:
@Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     ... }
透過呼叫 FragmentManager.findFragmentById(),再將 <fragment> 元素的資源 ID 傳遞給它,以取得片段的控制代碼。請注意,當您建置版面配置檔案時,資源 ID R.id.map 會自動新增到 Android 專案。
接著,使用 getMapAsync() 在片段上設定回呼。
MapFragment mapFragment = (MapFragment) getFragmentManager()     .findFragmentById(R.id.map); mapFragment.getMapAsync(this);
注意:Google Maps Android API 需要 API 層級 12 或更高版本,才能支援 MapFragment 物件。 如果您以 API 層級 21 以前的應用程式為目標,您可以透過 SupportMapFragment 類別存取相同的功能。您也必須包括 Android 支援程式庫
注意:getMapAsync() 必須從主要執行緒呼叫,然後回呼才會在主要執行緒中執行。 如果使用者的裝置上未安裝 Google Play 服務,在使用者安裝 Play 服務之前,都不會觸發回呼。
使用 onMapReady(GoogleMap) 回呼方法取得 GoogleMap 物件的控制代碼。 地圖就緒可供使用時時,就會觸發回呼。 它提供不是 Null 的 GoogleMap 實例。 例如,您可以使用 GoogleMap 物件設定地圖的檢視選項,或新增標記。
@Override public void onMapReady(GoogleMap map) {     map.addMarker(new MarkerOptions()         .position(new LatLng(0, 0))         .title("Marker")); }

地圖物件

Google Maps Android API 允許在您的 Android 應用程式中顯示 Google 地圖。 這些地圖和您在 Google Maps for Mobile (GMM) 應用程式中看到的地圖外觀相同,而且 API 會公開許多相同的功能。GMM 應用程式與由 Google Maps Android API 顯示的地圖之間有兩個明顯差異:
  • 由 API 顯示的地圖方塊不包含任何個人化內容,例如個人化的智慧圖示。
  • 並非地圖上的所有圖示都可以點選。 例如,您無法點選大眾運輸車站圖示。 然而,您新增到地圖的標記可以點選,而 API 會有接聽程式回呼介面可用於各種標記互動。
除了地圖功能之外,API 也完全支援和 Android UI 模型一致的各種互動。 例如,您可以透過定義會回應使用者手勢的接聽程式,以設定與地圖的互動。
使用地圖物件時的重要類別是 GoogleMap 類別。 GoogleMap 會在您的應用程式內建立地圖物件模型。 在您的 UI 內,地圖會以 MapFragment 或 MapView 物件代表。
GoogleMap 會自動處理下列操作:
  • 連線到「Google 地圖」服務。
  • 下載地圖方塊。
  • 在裝置螢幕上顯示地圖方塊。
  • 顯示各種控制項,例如平移和縮放。
  • 透過移動地圖和放大或縮小地圖,以回應平移和縮放手勢。
除了這些自動化操作之外,您還可以使用 API 的物件與方法來控制地圖行為。 例如,GoogleMap 具有的回呼方法,可以回應按鍵與地圖上的輕觸手勢。您也可以在地圖上設定標記圖示,然後使用您提供給 GoogleMap 的物件在它上面加上疊加層。

MapFragment

MapFragment 是 Android Fragment 類別的子類別,允許您在 Android 片段中放置地圖。MapFragment 物件可以當成地圖的容器,並提供對 GoogleMap 物件的存取。
和 View 不同,Fragment 代表一種行為或活動中的一部分使用者介面。 您可以合併單一活動中的多個片段,以建置多窗格 UI 以及在多個活動中重複使用片段。 請參閱有關片段的 Android 文件以深入瞭解。

MapView

MapView 是 Android View 類別的子類別,允許您在 Android View 片段中放置地圖。View 代表畫面的矩形區域,而且是 Android 應用程式與小工具的基礎建置區塊。MapView很像MapFragment,可以當成地圖容器,透過 GoogleMap 物件公開核心地圖功能。
完全互動模式使用 API 時,此類別的使用者必須將所有活動生命週期方法轉送給 MapView 類別中的對應方法。生命週期方法的範例包括 onCreate()onDestroy()onResume() 及 onPause()。 在精簡版中使用 API 時,可以選擇性地轉送生命週期事件。 如需詳細資料,請參閱精簡版文件。

地圖類型

Google Maps Android API 提供許多地圖類型。 地圖的類型規範整體的地圖呈現方式。 例如,地圖集通常包含著重於顯示邊界的政治地圖,以及顯示某城市或地區所有道路的道路地圖。
Google Maps Android API 提供四種地圖類型,以及完全不顯示地圖的選項:
標準
一般道路地圖。 道路會有一些人造特徵和重要的自然特徵,例如會顯示河流。 也可以看見道路與特徵標籤。
混合
衛星圖資料加上道路地圖。 也可以看見道路與特徵標籤。
衛星
衛星圖資料。 看不見道路與特徵標籤。
地形
地形測量資料。 地圖包括色彩、等高線與標籤,以及透視陰影。 也可以看見一些道路與標籤。
無地圖方塊。 地圖會轉譯為不載入任何地圖方塊的空網格。

變更地圖類型

若要設定地圖類型,請呼叫 GoogleMap 物件的 setMapType() 方法,傳遞 GoogleMap 中定義的其中一個類型常數。例如,若要顯示衛星地圖:
GoogleMap map; ... // Sets the map type to be "hybrid" map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
下列影像顯示比較相同位置的一般、混合及地形地圖:
MapType 比較

室內地圖

在高縮放層級中,地圖將顯示室內空間 (例如機場、大型購物中心、大型零售商店及大眾運輸車站) 的樓層平面圖。這些樓層平面圖稱為室內地圖,顯示於「一般」與「衛星」地圖類型 (GoogleMap.MAP_TYPE_NORMAL 與 GoogleMap.MAP_TYPE_SATELLITE)。當使用者放大時會自動啟用,並在地圖縮小時自動淡去。

在 API 中使用室內地圖

以下摘要說明 API 中的室內地圖功能:
  • 您可以透過呼叫 GoogleMap.setIndoorEnabled(false) 以停用室內地圖。預設會啟用室內地圖。 一次只會在一個地圖上顯示室內地圖。根據預設,這是第一個新增至您應用程式的地圖。 如果要在不同的地圖上顯示室內地圖,請先在第一個地圖上將它們停用,再於第二個地圖上呼叫 setIndoorEnabled(true)
  • 如果要停用預設的樓層挑選器,請呼叫 GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false)。如需詳細資料,請參閱與地圖互動。GoogleMap 上的介面OnIndoorStateChangeListener 可讓您設定當新建築物成為焦點,或在建築中啟用新樓層時要呼叫的接聽程式。如需詳細資料,請參閱與地圖互動
  • GoogleMap.getFocusedBuilding() 可提供目前聚焦的建築物。您接下來可以透過呼叫 IndoorBuilding.getActiveLevelIndex(),以尋找目前的作用中樓層。請參閱參考文件,以查看 IndoorBuilding 與 IndoorLevel 物件中可用的所有資訊。

新增樓層平面圖

室內地圖 (樓層平面圖) 可在選取位置取得。如果您要在應用程式中著重展示的建築物沒有樓層平面圖資料,您可以:
  • 直接新增樓層平面圖至「Google 地圖」。 這樣一來,「Google 地圖」的所有使用者就能使用您的樓層平面圖。
  • 在您的地圖上將樓層平面圖顯示為地面疊加層地圖方塊疊加層。 這樣只有您應用程式的使用者才能檢視您的樓層平面圖。

設定初始狀態

Maps API 可讓您針對應用程式的需求設定適當的地圖初始狀態。 您可以指定下列各項:
  • 相機位置,包括:位置、縮放、方位及傾斜度。 如需相機位置的詳細資訊,請參閱變更地圖檢視
  • 地圖類型。
  • 是否要在畫面上顯示縮放按鈕和/或指南針。
  • 使用者可用來操縱相機的手勢。
  • 是否要啟用精簡版。 精簡版地圖是地圖的點陣圖影像,可支援完整 API 提供的功能子集。
如果您已將地圖新增至活動的版面配置檔案,可以透過 XML 設定地圖的初始狀態,或如果以程式設計方式新增地圖,可以使用同樣的方式來設定。

使用 XML 屬性

本節說明如果使用 XML 版面配置檔案將地圖新增至您的應用程式,應該如何設定地圖的初始狀態。
Maps API 可為 MapFragment 或 MapView 定義一組自訂 XML 屬性,您可以用來直接從版面配置檔案設定地圖的初始狀態。目前已定義下列屬性:
  • mapType。 這可讓您指定要顯示的地圖類型: 有效值包括:nonenormalhybridsatellite 及 terrain
  • cameraTargetLatcameraTargetLngcameraZoomcameraBearingcameraTilt。 這些可讓您指定初始相機位置。 如需相機位置與其屬性的詳細資訊,請參閱這裡
  • uiZoomControlsuiCompass。 這些可讓您指定是否要在地圖上顯示縮放控制項與指南針。 如需更多詳細資料,請參閱 UiSettings
  • uiZoomGesturesuiScrollGesturesuiRotateGesturesuiTiltGestures。 這些可讓您指定要啟用/停用哪個與地圖互動的手勢。 如需詳細資料,請參閱 UiSettings
  • zOrderOnTop。 控制是否要將地圖檢視的介面放在其視窗上方。 如需詳細資料,請參閱 SurfaceView.setZOrderOnTop(boolean)。 請注意,這將涵蓋可在地圖上顯示的所有其他檢視 (例如,縮放控制項、我的位置按鈕)。
  • useViewLifecycle。 只有搭配 MapFragment 使用時才有效。 此屬性指定地圖生命週期應該繫結至片段的檢視或片段本身。如需更多詳細資料,請參閱這裡
  • liteMode。 true 的值會將地圖設定為精簡版。 精簡版地圖是地圖的點陣圖影像,可支援完整 API 提供的功能子集。此屬性的預設值為 false
如果要在您的 XML 版面配置檔案內使用這些自訂屬性,您必須先新增下列命名空間宣告。 您可以選擇任何命名空間,它不一定要是 map
xmlns:map="http://schemas.android.com/apk/res-auto"
接著,您可以如同使用標準 Android 屬性一樣,將前置詞為 map: 的屬性新增到您的版面配置元件。
下列 XML 程式碼片段說明如何使用一些自訂選項設定 MapFragment。 相同的屬性也適用於 MapView
<fragment xmlns:android="http://schemas.android.com/apk/res/android"   xmlns:map="http://schemas.android.com/apk/res-auto"   android:name="com.google.android.gms.maps.SupportMapFragment"   android:id="@+id/map"   android:layout_width="match_parent"   android:layout_height="match_parent"   map:cameraBearing="112.5"   map:cameraTargetLat="-33.796923"   map:cameraTargetLng="150.922433"   map:cameraTilt="30"   map:cameraZoom="13"   map:mapType="normal"   map:uiCompass="false"   map:uiRotateGestures="true"   map:uiScrollGestures="false"   map:uiTiltGestures="true"   map:uiZoomControls="false"   map:uiZoomGestures="true"/>
注意:如果您正在使用 Google Maps Mobile SDK for Work,您必須在每個屬性加上前置詞 m4b_。 例如,指定地圖類型屬性時,請使用 m4b_mapType,而不是 mapType。 或者,指定縮放控制項時,請使用 m4b_uiZoomControls,而不是 uiZoomControls 等等。

以程式設計方式

本節說明如果以程式設計方式將地圖新增至您的應用程式,應該如何設定地圖的初始狀態。
如果您以程式設計方式新增 MapFragment(或 MapView),接下來您可以透過以您指定的選項傳遞 GoogleMapOptions 物件,以設定其初始狀態。可以使用的選項和可透過 XML 使用的那些選項一樣。您可以建立 GoogleMapOptions 物件,如下所示:
GoogleMapOptions options = new GoogleMapOptions();
然後設定如下:
options.mapType(GoogleMap.MAP_TYPE_SATELLITE)     .compassEnabled(false)     .rotateGesturesEnabled(false)     .tiltGesturesEnabled(false);
如果要在您建立地圖時套用這些選項,請執行下列其中一個動作:

地圖邊框間距

此影片展示地圖邊框間距範例。
Google 地圖的設計是填滿其容器元素 (通常是 MapView 或 MapFragment) 定義的整個區域。 地圖容器的維度可定義數個地圖如何顯示和運作的層面:
  • 相機的目標將會反映填補區域的中心。
  • 地圖控制項會放在地圖邊緣的相對位置。
  • 法律資訊 (例如著作權聲明或 Google 標誌) 會出現在地圖下緣。
您可以使用 GoogleMapsetPadding() 方法,在地圖邊緣加上邊框間距。 地圖會持續填滿整個容器,但文字與控制項位置、地圖手勢及相機移動方向,運作上就有如放在較小的空間。這會導致下列變更:
  • 透過 API 呼叫或按下按鈕的相機移動方向 (例如,指南針、我的位置、縮放按鈕) 將會相對於填上邊框的區域。
  • getCameraPosition() 將會傳回填上邊框的區域中心。
  • Projection.getVisibleRegion() 將會傳回填上邊框的區域。
  • UI 控制項會依照指定的像素數目從容器邊緣偏移。
設計和地圖有部分重疊的 UI 時,邊框間距會非常有用。 例如,下列影像中的地圖會在上邊緣與右邊緣填上邊框間距。 可見的地圖控制項與法律文字會沿著填上邊框的區域邊緣 (以綠色顯示) 顯示,同時地圖會持續填滿整個容器 (以藍色顯示)。在此範例中,您可以讓選單浮在地圖右側,而不會遮住地圖控制項。
地圖邊框間距
注意:根據 Google Maps API 服務條款,您的應用程式不得移除或遮蓋 Google 標誌或著作權聲明。地圖邊框間距可讓您視需要重新放置這些元素的位置。如果您要在地圖底部顯示自訂 UI,請在地圖底部加上邊框間距,使標誌與法律聲明隨時可見。

沒有留言:

張貼留言