设置现有地图

本主题介绍了如何使用 Maps SDK for Android 设置已添加到 Android 应用的地图。

概览

已配置地图设置的京都地图的屏幕截图。 将地图添加到应用后,您便可以配置地图的初始设置和运行时设置。您需要根据地图容器(SupportMapFragmentMapView)是以静态还是动态方式添加的来配置初始设置。如果地图容器是以静态方式添加的,您可以在布局文件中配置初始地图设置。如果是以动态方式添加的,您可以使用 GoogleMapOptions 对象在 OnCreate 回调中配置初始设置。

如需详细了解如何添加地图容器,请参阅添加地图

初始地图设置包括以下内容:

在运行时,您可以通过更新 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 的地图模板创建应用。地图模板会自动配置您的项目和添加基本地图。fragment 是以静态方式添加的,可用作地图容器。如需了解详情,请参阅快速入门

  • 手动针对 SDK 配置您的项目添加基本地图。这样一来,您就可以使用任何 Android 模板和将地图添加到现有应用中。

以静态方式添加地图后对其进行设置

本部分介绍了在您以静态方式将地图添加到布局文件的情况下如何设置地图的初始状态。

Maps SDK for Android 为 SupportMapFragmentMapView 定义了一组自定义 XML 属性,您可以利用它们直接在布局文件内配置地图的初始状态。当前定义的属性如下:

  • mapType - 要显示的地图类型。有效值包括:nonenormalhybridsatelliteterrain

  • cameraTargetLatcameraTargetLngcameraZoomcameraBearingcameraTilt - 相机的初始位置。如需了解详情,请参阅相机和视图指南。

  • uiZoomControlsuiCompass - 指定是否显示缩放控件和罗盘。如需了解详情,请参阅 UiSettings

  • uiZoomGesturesuiScrollGesturesuiRotateGesturesuiTiltGestures - 指定是否启用特定手势。如需了解详情,请参阅 UiSettings

  • zOrderOnTop - 指明地图视图的表面是否显示在地图窗口、地图控件和窗口中的任何对象之上。如需了解详情,请参阅 SurfaceView.setZOrderOnTop(boolean)

  • useViewLifecycle - 此属性必须与 SupportMapFragment 对象共同使用才能生效。指定是否应将地图的生命周期与 fragment 的视图或 fragment 本身关联。如需了解详情,请参阅此处

  • 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
      

下图显示的是普通地图类型、混合地图类型和地形地图类型之间的对比情况:

MapType 对比

设定室内地图设置

在较高的缩放级别下,地图会显示机场、购物中心、大型零售商店和公交站点等室内场所的楼层平面图。“普通”和“卫星”地图类型GoogleMap.MAP_TYPE_NORMALGoogleMap.MAP_TYPE_SATELLITE)可显示这些楼层平面图(称为室内地图)。当用户放大地图时,楼层平面图会自动打开;当用户缩小地图时,楼层平面图会逐渐消失。

弃用通知:在未来的版本中,室内地图仅会在 normal 地图类型上显示。从该未来版本开始,satelliteterrainhybrid 地图将不支持室内地图。即使不支持室内地图,isIndoorEnabled() 也将继续返回通过 setIndoorEnabled() 设置的值,与它现在的处理方式相同。默认情况下,setIndoorEnabledtrue。您可以在版本说明中了解这些地图类型何时停止支持室内地图。

室内地图示例

下面概要列出了 API 中的室内地图功能:

设置地图内边距

这段视频展示了一个地图内边距示例。

Google 地图设计为填充由其容器元素(通常是 MapViewSupportMapFragment)定义的整个区域。地图外观和行为的若干方面都由其容器的尺寸定义:

  • 相机的目标将反映含内边距的区域的中心。
  • 地图控件以地图边缘为参照物进行定位。
  • 版权声明或 Google 徽标等法律信息沿地图底部边缘显示。

您可以利用 GoogleMapsetPadding() 方法围绕地图边缘添加内边距。地图将继续填充整个容器,但文本和控件定位、地图手势以及相机移动将呈现出将地图置于较小空间时的行为。这会导致出现以下变化:

  • 通过 API 调用或按下按钮(例如罗盘按钮、“我的位置”按钮、缩放按钮)进行的相机移动会变成相对于内边距区域的移动。
  • getCameraPosition 方法会返回含内边距的区域的中心。
  • ProjectiongetVisibleRegion 方法会返回含内边距的区域。
  • 界面控件会按指定的像素数从容器边缘偏移。

设计与地图的某些部分重叠的界面时,内边距会很有用。在下图中,地图沿顶部边缘和右侧边缘设置了内边距。可见地图控件和法律文本将沿含内边距的区域的边缘显示(显示为绿色),而地图仍将继续填充整个容器(显示为蓝色)。在此示例中,您可以让菜单悬浮在地图右侧的上方,这样不会遮盖住地图控件。

地图内边距