С помощью Navigation SDK для Android вы можете настраивать удобство использования карты, выбирая, какие из встроенных элементов управления пользовательского интерфейса и элементов будут на ней отображаться. Вы также можете настроить внешний вид интерфейса навигации. Рекомендации по допустимым изменениям интерфейса навигации приведены на странице правил.
В этом документе описаны два способа изменения пользовательского интерфейса карты:
Элементы управления пользовательского интерфейса карты
Чтобы разместить собственные элементы пользовательского интерфейса в режиме навигации, используйте элементы управления пользовательского интерфейса карты для правильного позиционирования. При изменении встроенного макета Navigation SDK для Android автоматически меняет положение пользовательских элементов управления.
Для каждой позиции можно задать только один пользовательский вид. Если в дизайне требуется несколько элементов интерфейса, вы можете поместить их в ViewGroup и передать в метод setCustomControl.
Метод setCustomControl предоставляет позиции, определенные в перечислении CustomControlPosition:
SECONDARY_HEADER(появляется только в вертикальном режиме)BOTTOM_START_BELOWBOTTOM_END_BELOWFOOTER
Как добавить собственный элемент управления
- Создайте Android View с собственным элементом интерфейса или ViewGroup.
- Распакуйте XML-файл или создайте экземпляр специального представления, чтобы получить экземпляр представления.
Используйте
NavigationView.setCustomControlилиNavigationFragment.setCustomControlс выбранным положением элемента управления из перечисленияCustomControlPosition.В следующем примере создается фрагмент и добавляется пользовательский элемент управления в позицию дополнительного заголовка.
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) он находится над карточкой с расчетным временем прибытия и/или настраиваемым нижним колонтитулом (или внизу карты, если ни того, ни другого нет), а элементы Navigation SDK, включая кнопку центрирования и логотип Google, сдвигаются вверх, чтобы освободить место для настраиваемого элемента управления. Этот элемент управления находится в пределах видимых границ карты, поэтому любые отступы, добавленные к нижнему или начальному краям карты, также изменят его положение.
Нижний конец
Чтобы использовать эту позицию, передайте CustomControlPosition.BOTTOM_END_BELOW в setCustomControl.
Этот элемент управления находится в правом нижнем углу карты. В portrait mode он находится над карточкой времени прибытия и/или настраиваемым нижним колонтитулом (или внизу карты, если ни того, ни другого нет), а в landscape mode – выравнивается по нижнему краю карты. Все элементы Navigation SDK, видимые в конце (справа при письме слева направо), перемещаются вверх, чтобы освободить место для пользовательского элемента управления. Этот элемент управления находится в пределах видимых границ карты, поэтому любые отступы, добавленные к нижнему или конечному краям карты, также изменят положение этого элемента управления.
Footer
Чтобы использовать эту позицию, передайте CustomControlPosition.FOOTER в setCustomControl.
Эта позиция предназначена для пользовательского нижнего колонтитула. Если карточка времени прибытия Nav SDK видна, этот элемент управления находится над ней. В противном случае элемент управления выравнивается по нижнему краю карты. В отличие от пользовательских элементов управления BOTTOM_START_BELOW и BOTTOM_END_BELOW, этот элемент управления расположен за пределами видимых границ карты, поэтому любые отступы, добавленные на карту, не изменят его положение.
В portrait mode настраиваемый нижний колонтитул занимает всю ширину. Пользовательские элементы управления в позициях CustomControlPosition.BOTTOM_START_BELOW и CustomControlPosition.BOTTOM_END_BELOW, а также элементы интерфейса Navigation SDK, такие как кнопка центрирования и логотип Google, располагаются над нижним колонтитулом пользовательских элементов управления. Положение шеврона по умолчанию учитывает высоту нижнего колонтитула.
В landscape mode нижний колонтитул имеет половинную ширину и выравнивается по левому краю (при письме слева направо), как и карточка времени прибытия в Navigation SDK. Пользовательские элементы управления в позиции CustomControlPosition.BOTTOM_START_BELOW и элементы интерфейса Navigation SDK, такие как кнопка центрирования и логотип Google, расположены над нижним колонтитулом пользовательского элемента управления. Пользовательские элементы управления в позиции CustomControlPosition.BOTTOM_END_BELOW и любые элементы интерфейса Navigation SDK, расположенные с правой стороны (при письме слева направо), остаются выровненными по нижнему краю карты. Положение шеврона по умолчанию не меняется, если используется собственный нижний колонтитул, поскольку он не доходит до края карты.
Пользовательские элементы управления в позициях CustomControlPosition.BOTTOM_START_BELOW и CustomControlPosition.BOTTOM_END_BELOW, а также элементы интерфейса Navigation SDK, такие как кнопка центрирования и логотип Google, располагаются над нижним колонтитулом пользовательских элементов управления.
Дополнительные элементы интерфейса карты
Navigation SDK для Android предоставляет элементы интерфейса, которые появляются во время навигации, аналогичные тем, которые есть в приложении "Google Карты" для Android. Вы можете настроить видимость или внешний вид этих элементов управления, как описано в этом разделе. Изменения, внесенные здесь, будут применены во время следующего сеанса навигации.
Допустимые изменения интерфейса навигации описаны в правилах.
Ознакомьтесь с кодом
Выделение пункта назначения и входов
Если пункт назначения создан с помощью 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 для Android теперь использует Google Maps API для маркеров. Дополнительную информацию можно найти в документации по Maps API.
Плавающий текст
Вы можете добавить плавающий текст в любом месте приложения, если он не закрывает атрибуцию Google. Navigation SDK не поддерживает привязку текста к широте/долготе на карте или к ярлыку. Подробнее об информационных окнах…
Показывать ограничение скорости
Вы можете программно показывать или скрывать значок ограничения скорости. Используйте переключатель NavigationView.setSpeedLimitIconEnabled() или NavigationFragment.setSpeedLimitIconEnabled(), чтобы показать или скрыть значок ограничения скорости. Если эта функция включена, во время навигации в нижнем углу экрана будет показываться значок ограничения скорости. На значке показано ограничение скорости на дороге, по которой движется автомобиль. Значок появляется только в тех местах, где доступны надежные данные об ограничении скорости.
// Display the Speed Limit icon
mNavFragment.setSpeedLimitIconEnabled(true);
Значок ограничения скорости временно скрывается, когда показывается кнопка центрирования.
Настроить ночной режим
Вы можете программно управлять поведением ночного режима. Используйте NavigationView.setForceNightMode() или NavigationFragment.setForceNightMode(), чтобы включить или отключить ночной режим, или разрешите Navigation SDK для Android управлять им.
AUTO– Navigation SDK определяет подходящий режим в зависимости от местоположения устройства и местного времени.FORCE_NIGHTпринудительно включает ночной режим.FORCE_DAY– принудительно включить дневной режим.
В примере ниже показано, как принудительно включить ночной режим во фрагменте навигации.
// 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));
}
Не забудьте перенаправить события жизненного цикла в DirectionsListView так же, как и в NavigationView. Пример:
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);
Индикатор выполнения поездки

Индикатор выполнения поездки – это вертикальная полоса, которая появляется в начале карты при запуске навигации. Если он включен, на экране показывается обзор всей поездки, а также пункт назначения и текущее местоположение пользователя.
Это позволяет пользователям предвидеть любые предстоящие проблемы, такие как трафик, без необходимости увеличивать масштаб. При необходимости они могут изменить маршрут. Если пользователь меняет маршрут, индикатор выполнения сбрасывается, как если бы поездка началась заново.
На индикаторе выполнения поездки отображаются следующие статусы:
Пройденный маршрут – пройденная часть маршрута.
Текущее местоположение – текущее местоположение пользователя в поездке.
Статус трафика – статус трафика на маршруте.
Пункт назначения – конечный пункт поездки.
Включите индикатор выполнения поездки, вызвав метод setTripProgressBarEnabled() в NavigationView или NavigationFragment.
Пример:
// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);
Расположение индикатора выполнения поездки
- Левая сторона панели примерно выравнивается по левой стороне спидометра, логотипа Google и кнопки "По центру" (если она видна). Ширина – 12 dp.
- Индикатор выполнения поездки имеет фиксированную высоту. Чтобы адаптироваться к ограничениям вертикального пространства на небольших устройствах, видимость и высота индикатора выполнения поездки адаптируются на основе указанных контрольных точек высоты экрана. Эти контрольные точки не зависят от ориентации устройства и от того, сколько места на экране занимает карта.
- Если индикатор выполнения поездки перекрывает карточку поворота или другие элементы интерфейса навигации, он отображается под ними.
| Высота экрана | Видимость индикатора выполнения поездки | Высота индикатора выполнения поездки | Положение индикатора выполнения поездки по оси Y |
|---|---|---|---|
| Маленький: 0–551 dp. | Не отображается | Н/Д | Н/Д |
| Средний: 552–739 dp | Показывать | 130 dp | Над элементами управления на стороне начала маршрута (спидометр, логотип Google, кнопка центрирования) |
| Большой: 740 dp и больше. | Показывать | 290 dp | Над элементами управления на стороне начала маршрута (спидометр, логотип Google, кнопка центрирования) |
Компас
В Navigation SDK предусмотрен значок компаса, который появляется в правом верхнем углу, Когда пользователь нажимает на компас, камера возвращается в положение, при котором направление равно нулю (ориентация по умолчанию), после чего компас скрывается.
Если навигация включена, а для камеры выбран режим слежения, компас остается видимым. Нажав на него, можно переключиться между наклонным и общим видом.
Чтобы избежать отвлекающих факторов для водителя, компас остается на месте, если заголовок (в режиме портретной съемки) расширяется и конфликтует с положением компаса по умолчанию. Если вы добавите дополнительный элемент управления заголовком или вспомогательное представление заголовка, компас будет скрыт, чтобы избежать конфликтов в интерфейсе.
Компас поддерживает дневной, ночной и тёмный режимы.
Компас включен по умолчанию. Чтобы включить или отключить компас, используйте метод compassEnabled класса GoogleMapOptions.
Отключить 3D-здания
На устройствах с низкой производительностью можно отключить показ 3D-зданий, вызвав метод GoogleMap.setBuildingsEnabled(false).
Prompt Visibility API (экспериментальная функция)
Prompt Visibility API позволяет избежать конфликтов между элементами интерфейса, созданными Navigation SDK, и вашими собственными элементами интерфейса. Для этого нужно добавить прослушиватель, который будет получать обратный вызов перед появлением элемента интерфейса Navigation SDK и сразу после его удаления. Дополнительную информацию, в том числе примеры кода, можно найти в разделе Prompt Visibility API на странице Настройка уведомлений о сбоях в реальном времени.