修改导航界面

借助 Navigation SDK for Android,您可以确定将哪些内置界面控件和元素显示在地图上,从而修改地图的用户体验。您还可以调整导航界面的视觉外观。如需了解有关导航界面可接受修改的准则,请参阅“政策”页面。

本文档介绍了如何通过以下两种方式修改地图界面:

地图界面控件

如需在导航视图中放置自定义界面元素,请使用地图界面控件进行正确定位。当内置布局发生变化时,Navigation SDK for Android 会自动重新定位自定义控件。您一次只能为每个位置设置一个自定义控件视图。如果您的设计需要多个界面元素,您可以将它们放在 ViewGroup 中,并将其传递给 setCustomControl 方法。

setCustomControl 方法提供 CustomControlPosition 枚举中定义的位置:

  • SECONDARY_HEADER(仅在竖屏模式下显示)
  • BOTTOM_START_BELOW
  • BOTTOM_END_BELOW
  • FOOTER
纵向屏幕方向的自定义控件位置。
纵向模式下的自定义控件位置
横向模式下的自定义控件位置。
横向模式下的自定义控件位置

添加自定义控件

  1. 使用自定义界面元素或 ViewGroup 创建 Android View。
  2. 膨胀 XML 或实例化自定义视图,以获取视图的实例。
  3. 将 NavigationView.setCustomControl 或 NavigationFragment.setCustomControl 与 CustomControlPosition 枚举中选择的自定义控件位置搭配使用。

    以下示例会创建一个 fragment,并在次级标题位置添加一个自定义控件。

     mNavFragment.setCustomControl(getLayoutInflater().
       inflate(R.layout.your_custom_control, null),
       CustomControlPosition.SECONDARY_HEADER);
     ```
    

移除自定义控件

如需移除自定义控件,请调用 setCustomControl 方法,并传入 null 视图参数和所选的自定义控件位置。

例如,以下代码段会移除所有自定义次级标题,并返回到默认内容:

mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);

自定义控件位置

次级标题

纵向模式下的次级标题自定义控件位置。
纵向模式下的辅助标题自定义控件位置

如需使用此自定义控件位置,请将位置 CustomControlPosition.SECONDARY_HEADER 传递给 setCustomControl。

默认情况下,导航模式下的屏幕布局会为主标题下方的位置提供一个次级标题。此辅助标题会在必要时显示,例如在车道指引中。您的应用可以使用布局的此辅助标题位置来显示自定义内容。使用此功能时,您的控制范围涵盖所有默认的次级标题内容。如果导航视图有背景,该背景会保留在原处,并被次级标题覆盖。 当您的应用移除自定义控件时,任何默认的次级标题都可以显示在其位置。

自定义次级标题位置的上边缘与主标题的下边缘对齐。此职位仅在portrait mode提供。在 landscape mode 中,次级标题不可用,并且布局不会更改。

底部开始

竖屏模式下底部起始自定义控件位置。
竖屏模式下的底部起始自定义控件位置
横屏模式下底部开始自定义控件位置。
横向模式下的底部起始自定义控件位置

如需使用此自定义控件位置,请将位置 CustomControlPosition.BOTTOM_START_BELOW 传递给 setCustomControl。

此自定义控件位置位于地图的底部起始角。在 portrait mode 和 landscape mode 中,它位于预计到达时间卡片和/或自定义页脚上方(如果两者都不存在,则位于地图底部),并且导航 SDK 元素(包括重新居中按钮和 Google 徽标)会向上移动,以适应自定义控件视图的高度。此控件位于可见地图边界内,因此,对地图底部或起始边缘添加的任何内边距也会改变此控件的位置。

底部

纵向模式下的底部自定义控件位置。
纵向模式下的底部末端自定义控件位置
横屏模式下底部自定义控件的位置。
横向模式下的底部自定义控件位置

如需使用此自定义控件位置,请将位置 CustomControlPosition.BOTTOM_END_BELOW 传递给 setCustomControl。

此自定义控件位置位于地图的右下角。在 portrait mode 中,它位于预计到达时间卡片和/或自定义页脚上方(如果两者都不存在,则位于地图底部),但在 landscape mode 中,它与地图底部对齐。沿末端(从左到右书写时为右侧)显示的任何 Nav SDK 元素都会向上移动,以适应自定义控件视图的高度。此控件位于可见地图边界内,因此,在地图底部或末端边缘添加的任何内边距也会改变此控件的位置。

纵向模式下的页脚自定义控件位置。
竖屏模式下的页脚自定义控件位置
横屏模式下的页脚自定义控件位置。
横屏模式下的页脚自定义控件位置

如需使用此自定义控件位置,请将位置 CustomControlPosition.FOOTER 传递给 setCustomControl。

此自定义控件位置专为自定义页脚视图而设计。如果导航 SDK 预计到达时间卡片可见,此控件会位于其上方。否则,控件将与地图底部对齐。与 BOTTOM_START_BELOW 和 BOTTOM_END_BELOW 自定义控件不同,此控件位于可见地图边界之外,这意味着向地图添加的任何内边距都不会改变此控件的位置。

在 portrait mode 中,自定义页脚为全宽。CustomControlPosition.BOTTOM_START_BELOW 和 CustomControlPosition.BOTTOM_END_BELOW 位置的自定义控件以及 Nav SDK 界面元素(例如重新居中按钮和 Google 徽标)都位于自定义控件页脚上方。V 形图标的默认位置会考虑自定义页脚高度。

在 landscape mode 中,自定义页脚为半宽,并与起始侧(从左到右语言中的左侧)对齐,就像 Nav SDK 预计到达时间卡片一样。CustomControlPosition.BOTTOM_START_BELOW 位置中的自定义控件和导航 SDK 界面元素(例如“重新居中”按钮和 Google 徽标)位于自定义控件页脚上方。CustomControlPosition.BOTTOM_END_BELOW 位置中的自定义控件以及沿结束侧(LTR 布局中的右侧)放置的所有导航 SDK 界面元素都会与地图底部保持对齐。当存在自定义页脚时,V 形图标的默认位置不会改变,因为页脚不会延伸到地图的末端。

CustomControlPosition.BOTTOM_START_BELOW 和 CustomControlPosition.BOTTOM_END_BELOW 位置的自定义控件以及导航 SDK 界面元素(例如“重新居中”按钮和 Google 徽标)位于自定义控件页脚上方。

地图界面配件

Navigation SDK for Android 提供了在导航期间显示的界面配件,类似于 Android 版 Google 地图应用中的配件。您可以按照本部分所述调整这些控件的可见性或视觉外观。您在此处所做的更改将在下次导航会话期间体现。

如需了解有关可接受的导航界面修改的指南,请参阅“政策”页面。

查看代码

目的地突出显示和入口

如果使用 placeID 创建目的地,系统会尽可能突出显示目的地建筑物,并显示入口图标。这些视觉提示可帮助用户区分和导航到目的地。

如需使用 placeID 创建目标,请使用 Waypoint.Builder.setPlaceIdString() 方法。

修改导航标题

使用 NavigationFragment.setStylingOptions() 或 NavigationView.setStylingOptions() 更改导航标题和下一个转弯指示器(如果可用,会显示在标题下方)的主题。

您可以设置以下属性:

属性类型属性
背景颜色
  • 主要日间模式 - 导航标题的日间颜色
  • 次要日间模式 - 下一个转弯指示器的日间颜色
  • 主要夜间模式 - 导航标题的夜间颜色
  • 次要夜间模式 - 下一个转弯指示器的夜间颜色
指令的文本元素
  • 文本颜色
  • 字体
  • 第一行的文字大小
  • 第二行的文字大小
后续步骤的文本元素
  • 字体
  • 距离值的文字颜色
  • 距离值的文字大小
  • 距离单位的文字颜色
  • 距离单位的文字大小
机动图标
  • 大号机动图标的颜色
  • 小型机动图标的颜色
车道导航
  • 建议车道的颜色

以下示例展示了如何设置样式选项:

private NavigationFragment mNavFragment;
mNavFragment = (NavigationFragment) getSupportFragmentManager()
  .findFragmentById(R.id.navigation_fragment);

// Set the styling options on the fragment.
mNavFragment.setStylingOptions(new StylingOptions()
  .primaryDayModeThemeColor(0xff1A237E)
  .secondaryDayModeThemeColor(0xff3F51B5)
  .primaryNightModeThemeColor(0xff212121)
  .secondaryNightModeThemeColor(0xff424242)
  .headerLargeManeuverIconColor(0xffffff00)
  .headerSmallManeuverIconColor(0xffffa500)
  .headerNextStepTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
  .headerNextStepTextColor(0xff00ff00)
  .headerNextStepTextSize(20f)
  .headerDistanceTypefacePath("/system/fonts/NotoSerif-Italic.ttf")
  .headerDistanceValueTextColor(0xff00ff00)
  .headerDistanceUnitsTextColor(0xff0000ff)
  .headerDistanceValueTextSize(20f)
  .headerDistanceUnitsTextSize(18f)
  .headerInstructionsTypefacePath("/system/fonts/NotoSerif-BoldItalic.ttf")
  .headerInstructionsTextColor(0xffffff00)
  .headerInstructionsFirstRowTextSize(24f)
  .headerInstructionsSecondRowTextSize(20f)
  .headerGuidanceRecommendedLaneColor(0xffffa500));

关闭路况图层

使用 GoogleMap.setTrafficEnabled() 可在地图上启用或停用路况图层。此设置会影响地图上整体显示的交通密度指示。不过,这不会影响导航器绘制的路线上的路况指示。

private GoogleMap mMap;
// Get the map, and when the async call returns, setTrafficEnabled
// (callback will be on the UI thread)
mMap = mNavFragment.getMapAsync(navMap -> navMap.setTrafficEnabled(false));

交通信号灯和停车标志

导航路线上的交通信号灯和停车标志图标。

在导航过程中,地图会显示交通信号灯和停车标志,以便为用户提供有关路线和前方路线的更多背景信息。从 8.0.0 版开始,您无法关闭此功能。

添加自定义标记

Navigation SDK for Android 现在使用 Google 地图 API 来添加标记。如需了解详情,请参阅 Maps API 文档。

浮动文字

您可以在应用中的任何位置添加浮动文字,前提是它不会遮盖 Google 属性。Navigation SDK 不支持将文本锚定到地图上的纬度/经度或标签。如需了解详情,请参阅信息窗口。

显示限速

您可以通过编程方式显示或隐藏限速图标。使用 NavigationView.setSpeedLimitIconEnabled() 或 NavigationFragment.setSpeedLimitIconEnabled() 显示或隐藏限速图标。启用后,限速图标会在导航期间显示在底部角落。该图标会显示车辆当前行驶道路的限速。该图标仅在有可靠限速数据的位置显示。

 // Display the Speed Limit icon
 mNavFragment.setSpeedLimitIconEnabled(true);

当显示“重新居中”按钮时,限速图标会暂时隐藏。

设置夜间模式

您可以通过编程方式控制夜间模式的行为。使用 NavigationView.setForceNightMode() 或 NavigationFragment.setForceNightMode() 开启或关闭夜间模式,或让 Navigation SDK for Android 控制夜间模式。

  • AUTO 让 Navigation SDK 根据设备位置和当地时间确定适当的模式。
  • FORCE_NIGHT 会强制开启夜间模式。
  • FORCE_DAY 会强制开启日间模式。

以下示例展示了如何在导航 fragment 中强制开启夜间模式:

// Force night mode on.
mNavFragment.setForceNightMode(FORCE_NIGHT);

显示路线列表

首先,创建视图并将其添加到层次结构中。

void setupDirectionsListView() {
  // Create the view.
  DirectionsListView directionsListView = new DirectionsListView(getApplicationContext());
  // Add the view to your view hierarchy.
  ViewGroup group = findViewById(R.id.directions_view);
  group.addView(directionsListView);

  // Add a button to your layout to close the directions list view.
  ImageButton button = findViewById(R.id.close_directions_button); // this button is part of the container we hide in the next line.
  button.setOnClickListener(
      v -> findViewById(R.id.directions_view_container).setVisibility(View.GONE));
}

请务必像处理 NavigationView 一样,将生命周期事件转发到 DirectionsListView。例如:

protected void onResume() {
  super.onResume();
  directionsListView.onResume();
}

隐藏备选路线

当界面因信息过多而变得杂乱时,您可以通过显示比默认数量(两条)更少的备选路线或根本不显示备选路线来减少杂乱。您可以在提取路线之前配置此选项,方法是使用以下枚举值之一调用 RoutingOptions.alternateRoutesStrategy() 方法:

枚举值说明
AlternateRoutesStrategy.SHOW_ALL 默认值。最多显示两条备选路线。
AlternateRoutesStrategy.SHOW_ONE 显示一条备选路线(如果有)。
AlternateRoutesStrategy.SHOW_NONE 隐藏备选路线。

以下代码示例演示了如何完全隐藏备选路线。

RoutingOptions routingOptions = new RoutingOptions();
routingOptions.alternateRoutesStrategy(AlternateRoutesStrategy.SHOW_NONE);
navigator.setDestinations(destinations, routingOptions, displayOptions);

行程进度条

导航中添加了行程进度条。

行程进度条是一个竖条,在导航开始时显示在地图的起始/前导侧。启用后,它会显示整个行程的概览,以及用户的目的地和当前位置。

这样,用户无需放大即可预测任何即将发生的问题,例如交通状况。然后,他们可以根据需要重新规划行程路线。如果用户重新规划行程路线,进度条会重置,就像从该点开始新行程一样。

行程进度条会显示以下状态指示器:

  • 已完成路线 - 行程中已完成的部分。

  • 当前位置 - 用户在行程中的当前位置。

  • 路况 - 前方路况。

  • 最终目的地 - 行程的最终目的地。

通过对 NavigationView 或 NavigationFragment 调用 setTripProgressBarEnabled() 方法来启用行程进度条。例如:

// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);

行程进度条定位

  • 该栏的左侧大致与车速表、Google 徽标和“重新居中”按钮(如果可见)的左侧对齐。宽度为 12 dp。
  • 行程进度条保持静态高度。为了适应较小设备中的垂直空间限制,行程进度条的可见性和高度会根据屏幕高度中的指定断点进行调整。这些断点与设备屏幕方向以及地图在屏幕上实际占用的空间无关:
  • 屏幕高度 行程进度条可见性 行程进度条高度 行程进度条 Y 轴位置
    小:0 dp - 551 dp 不显示 不适用 不适用
    中:552 dp - 739 dp 可见 130 dp 起点一侧的控件(车速表 / Google 徽标 / 重新居中按钮)上方
    大:740 dp 及以上 可见 290 dp 起点一侧的控件(车速表 / Google 徽标 / 重新居中按钮)上方
  • 如果行程进度条与转向卡片或其他导航界面元素重叠,则会显示在这些其他元素下方。

罗盘

Navigation SDK 提供的罗盘图形会在特定情况下显示在地图右上角,并且仅在启用时显示。用户点击罗盘时,镜头会移动并恢复到方向角为零的(默认朝向)位置,随后罗盘会逐渐消失。

如果启用了导航功能,并且摄像头模式设置为“跟随”,则指南针会保持可见,点按指南针可在倾斜和俯视摄像头视角之间切换。

为避免驾驶员分心,如果标题(在纵向模式下)展开并与指南针的默认位置冲突,指南针会保持在同一位置。如果您添加了次级标题自定义控件或标题辅助视图,系统会隐藏指南针,以避免界面冲突。

指南针支持日间模式、夜间模式和深色模式。

指南针默认处于启用状态。您可以使用 GoogleMapOptions 类中的 compassEnabled 方法设置是否启用指南针。

关闭 3D 建筑

对于性能受限的设备,您可以通过调用 GoogleMap.setBuildingsEnabled(false) 关闭 3D 建筑物的显示。

Prompt Visibility API(实验性)

借助 Prompt Visibility API,您可以添加一个监听器,以便在 Navigation SDK 界面元素即将显示之前以及该元素被移除后立即接收回调,从而避免 Navigation SDK 生成的界面元素与您自己的自定义界面元素之间发生冲突。如需了解详情(包括代码示例),请参阅配置实时中断页面中的提示可见性 API 部分。