修改导航界面

利用 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.setCustomControlSupportNavigationFragment.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 modelandscape mode 中,它位于预计到达时间卡片和/或自定义页脚上方(如果两者都不存在,则位于地图底部),并且 Nav SDK 元素(包括重新居中按钮和 Google 徽标)会向上移动,以适应自定义控件视图的高度。此控件位于可见地图边界内,因此添加到地图底部或起始边缘的任何内边距也会更改此控件的位置。

底部

纵向屏幕方向的底部自定义控件位置。
纵向模式下的底部自定义控制位置
横屏模式下的底部自定义控件位置。
横屏模式下的底部自定义控制位置

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

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

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

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

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

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

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

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

地图界面配件

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

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

查看代码

目的地突出显示和入口

如果创建的目的地包含 placeID,系统会尽可能突出显示目的地建筑物并显示入口图标。这些视觉提示有助于用户区分目的地并前往目的地。

如需创建具有 placeID 的目的地,请使用 Waypoint.Builder.setPlaceIdString() 方法。

修改导航标头

使用 SupportNavigationFragment.setStylingOptions()NavigationView.setStylingOptions() 可更改导航标题的主题以及标题下方显示的下一回合指示器(如果可用)。

您可以设置以下属性:

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

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

private SupportNavigationFragment mNavFragment;
mNavFragment = (SupportNavigationFragment) getFragmentManager()
  .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));

启用红绿灯和停车标志

您可以在有效导航期间启用地图中的红绿灯和停车标志显示,以便为路线和行程操作提供更多背景信息。

默认情况下,Navigation SDK 中会停用红绿灯和停车标志。如需启用此功能,请针对每个地图项单独调用 DisplayOptions

DisplayOptions displayOptions =
  new DisplayOptions().showTrafficLights(true).showStopSigns(true);

添加自定义标记

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

浮动文字

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

显示限速信息

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

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

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

设置夜间模式

您可以以编程方式控制夜间模式的行为。使用 NavigationView.setForceNightMode()SupportNavigationFragment.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 Hides alternate routes.(隐藏备选路线。)

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

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

行程进度条

已在导航中添加行程进度条。

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

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

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

  • 已过路线 - 行程中已过部分。

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

  • 路况信息 - 即将到来的路况。

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

通过对 NavigationViewSupportNavigationFragment 调用 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 徽标 / 重新居中按钮)
  • 如果行程进度条与转向卡或其他导航界面元素重叠,则会显示在这些其他元素下方。

提示可见性 API(实验性)

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