設定現有地圖

本主題說明如何使用 Maps SDK for Android 設定加入至 Android 應用程式的地圖。

總覽

已完成設定的京都地圖螢幕截圖。 在應用程式中加入地圖後,您可以進行地圖的初始和執行階段設定。視您是以靜態或動態方式加入地圖容器 (SupportMapFragmentMapView),進行初始設定的方法會有所不同。如果地圖容器是以靜態方式加入,您可以在版面配置檔案中進行初始地圖設定。 如果地圖容器是以動態方式加入,則可在 OnCreate 回呼中使用 GoogleMapOptions 物件來進行初始設定。

如要進一步瞭解如何加入地圖容器,請參閱加入地圖

初始地圖設定包括下列項目:

您可以藉由更新 onMapReady 回呼中的 GoogleMap 物件,在執行階段調整這些設定和一些其他設定。其他設定則可透過 GoogleMap 類別的方法進行調整,例如設定路況圖層地圖邊框間距的方法。

範例

在下方範例程式碼和上方螢幕截圖中,該地圖已完成下列設定。

初始設定應在版面配置檔案中進行:

  • 啟用縮放控制項。
  • 啟用旋轉手勢控制項。
  • 將地圖傾斜 30 度。

執行階段設定:

  • 將相機中心設為日本京都。
  • 啟用混合型地圖。
  • 開啟路況圖層。

初始設定


<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    map:uiZoomControls="true"
    map:uiRotateGestures="true"
    map:cameraTilt="30" />

執行階段設定

package com.example.mapsetup;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    // Update the map configuration at runtime.
    @Override
    public void onMapReady(GoogleMap googleMap) {
        // Set the map coordinates to Kyoto Japan.
        LatLng kyoto = new LatLng(35.00116, 135.7681);
        // Set the map type to Hybrid.
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        // Add a marker on the map coordinates.
        googleMap.addMarker(new MarkerOptions()
                .position(kyoto)
                .title("Kyoto"));
        // Move the camera to the map coordinates and zoom in closer.
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(kyoto));
        googleMap.moveCamera(CameraUpdateFactory.zoomTo(15));
        // Display traffic.
        googleMap.setTrafficEnabled(true);

    }
}

事前準備

開始之前,您可以先透過下列選項建立專案並新增基本地圖:

  • 使用 Android Studio 適用的地圖範本建立應用程式。地圖範本會自動設定專案並加入基本地圖。系統會使用片段做為地圖容器,並以靜態方式加入。詳情請參閱快速入門導覽課程

  • 手動為 SDK 設定專案加入基本地圖。這樣您就可以使用任何 Android 範本,並在現有應用程式中加入地圖。

以靜態方式加入地圖後的設定

本節說明如果您以靜態方式將地圖加入版面配置檔案,該如何設定地圖的初始狀態。

Maps SDK for Android 為 SupportMapFragmentMapView 定義了一組自訂 XML 屬性,可讓您直接從版面配置檔案設定地圖的初始狀態。以下屬性目前已定義:

  • mapType — 要顯示的地圖類型,有效值包括:nonenormalhybridsatelliteterrain

  • cameraTargetLatcameraTargetLngcameraZoomcameraBearingcameraTilt — 初始相機位置。詳情請參閱相機和檢視畫面指南。

  • uiZoomControlsuiCompass — 指定是否要顯示縮放控制項和指南針。詳情請參閱 UiSettings

  • uiZoomGesturesuiScrollGesturesuiRotateGesturesuiTiltGestures — 指定是否要啟用特定手勢。詳情請參閱 UiSettings

  • zOrderOnTop — 指出地圖檢視的表面是否要顯示在地圖視窗頂端、地圖控制項和視窗中任何物件上。詳情請參閱 SurfaceView.setZOrderOnTop(boolean)

  • useViewLifecycle — 必須使用 SupportMapFragment 物件才會生效。用於指定地圖的生命週期是否應繫結至片段本身或其檢視畫面。詳情請參閱這裡

  • liteMode — 要啟用精簡模式時為 true;否則為 false

如要在版面配置檔案中使用這些自訂屬性,則必須加入下列命名空間宣告。您可以選擇任何命名空間,不一定要是 map

xmlns:map="http://schemas.android.com/apk/res-auto"

接著,您就可以在版面配置檔案中加入包含 map: 前置字元的屬性。

以下版面配置檔案會設定包含自訂地圖屬性的 SupportMapFragment 物件。相同的屬性也可以套用至 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"/>

以動態方式加入地圖後的設定

本節說明如果您以動態方式將地圖加入應用程式中,該如何設定地圖的初始狀態。

如果您以動態方式加入 SupportMapFragmentMapView,則可在 GoogleMapOptions 物件中設定地圖的初始狀態。可用選項與版面配置檔案中的選項相同。您可以按照下列方式建立 GoogleMapOptions

Java

GoogleMapOptions options = new GoogleMapOptions();
      

Kotlin

val options = GoogleMapOptions()
      

然後依照下列方式設定:

Java

options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
    .compassEnabled(false)
    .rotateGesturesEnabled(false)
    .tiltGesturesEnabled(false);
      

Kotlin

options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
    .compassEnabled(false)
    .rotateGesturesEnabled(false)
    .tiltGesturesEnabled(false)
      

如要在建立地圖時套用這些選項,請執行下列其中一項操作:

設定路況圖層

您可以啟用路況圖層,藉此在地圖上顯示車流量資料。您可以透過呼叫 setTrafficEnabled() 方法來啟用或停用路況圖層,呼叫 isTrafficEnabled() 方法則可判斷路況圖層目前是否已啟用。下方螢幕截圖顯示的是已啟用路況圖層的地圖。

設定地圖類型

如要設定地圖類型,請呼叫 setMapType 方法。 舉例來說,如要顯示衛星地圖:

Java

// Sets the map type to be "hybrid"
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
      

Kotlin

// Sets the map type to be "hybrid"
map.mapType = GoogleMap.MAP_TYPE_HYBRID
      

下方圖片顯示一般、混合和地形地圖的比較:

地圖類型比較

設定室內地圖

在高倍縮放時,地圖會顯示室內空間 (例如機場、購物中心、大型零售商店和大眾運輸車站) 的平面圖。這些平面圖稱為「室內地圖」,會在「一般」和「衛星」地圖類型 (GoogleMap.MAP_TYPE_NORMALGoogleMap.MAP_TYPE_SATELLITE) 中顯示。系統會在使用者放大地圖時自動啟用這些平面圖,並在縮小地圖時逐漸消失。

淘汰通知:在日後推出的版本中,只有 normal 地圖會提供室內地圖。也就是說,日後自該版本推出後,satelliteterrainhybrid 地圖將不再支援室內地圖。即使屆時不再支援室內地圖,isIndoorEnabled() 也會繼續照常傳回透過 setIndoorEnabled() 設定的值。根據預設,setIndoorEnabledtrue。當這些地圖類型不再支援室內地圖,版本資訊便會公告相關資訊。

室內地圖範例

以下是 API 中的室內地圖功能摘要:

設定地圖邊框間距

這部影片會顯示地圖邊框間距的範例。

Google 地圖的設計會填滿由容器元素定義的整個區域,通常是 MapViewSupportMapFragment。地圖的部分顯示方式和行為模式取決於地圖容器的維度:

  • 相機的目標會反映設有邊框間距的區域中心。
  • 地圖控制項是依地圖邊緣決定其相對位置。
  • 版權聲明之類的法律資訊或是 Google 標誌,則沿著地圖的底部邊緣顯示。

您可以使用 GoogleMap 增加地圖邊緣周圍的邊框間距。setPadding() 方法。地圖將繼續填滿整個容器,但文字和控制項位置、地圖手勢及攝影機動作將有如被放置於一個較小的空間,順應改變行為。這將導致以下變化:

  • 透過 API 呼叫或按下按鈕 (例如「指南針」、「我的位置」和「縮放按鈕」) 產生的相機動作會以相對於設有邊框間距區域的方式進行。
  • getCameraPosition 方法會傳回設有邊框間距區域的中心。
  • ProjectiongetVisibleRegion 方法會傳回設有邊框間距的區域。
  • UI 控制項會從容器的邊緣偏移,偏移距離為指定的像素數。

設計與地圖中特定部分重疊的使用者介面時,邊框間距是頗為實用的功能。在下方圖片中,地圖的頂部邊緣和右邊緣都設有邊框間距。可見地圖控制項和法律文字將沿著設有邊框間距區域的邊緣顯示,以綠色表示;地圖將繼續填滿整個容器,以藍色表示。在這個範例中,您可以讓選單浮動在地圖右側,且不對地圖控制項做模糊處理。

地圖邊框間距