Navigation SDK for Android を使用すると、地図に表示する組み込みの UI コントロールや要素を指定して、地図のユーザー エクスペリエンスを変更できます。ナビゲーション UI の外観を調整することもできます。ナビゲーション UI の許容される変更に関するガイドラインについては、ポリシーページをご覧ください。
このドキュメントでは、地図のユーザー インターフェースを変更する 2 つの方法について説明します。
地図の UI コントロール
ナビゲーション ビューにカスタム UI 要素を配置するには、地図 UI コントロールを使用して適切な位置に配置します。組み込みレイアウトが変更されると、Navigation SDK for Android はカスタム コントロールを自動的に再配置します。各位置に一度に設定できるカスタム コントロール ビューは 1 つだけです。デザインに複数の UI 要素が必要な場合は、それらを ViewGroup に配置して setCustomControl メソッドに渡します。
setCustomControl メソッドは、CustomControlPosition 列挙型で定義されている位置を提供します。
SECONDARY_HEADER(ポートレート モードでのみ表示)BOTTOM_START_BELOWBOTTOM_END_BELOWFOOTER
カスタム コントロールを追加する
- カスタム UI 要素または ViewGroup を使用して Android View を作成します。
- XML をインフレートするか、カスタムビューをインスタンス化して、ビューのインスタンスを取得します。
NavigationView.setCustomControlまたはNavigationFragment.setCustomControlを使用して、CustomControlPosition列挙型から選択したカスタム コントロールの位置を指定します。次の例では、フラグメントを作成し、セカンダリ ヘッダーの位置にカスタム コントロールを追加します。
mNavFragment.setCustomControl(getLayoutInflater(). inflate(R.layout.your_custom_control, null), CustomControlPosition.SECONDARY_HEADER); ```
カスタム コントロールを削除する
カスタム コントロールを削除するには、null ビュー パラメータと選択したカスタム コントロールの位置を指定して setCustomControl メソッドを呼び出します。
たとえば、次のスニペットは、カスタムのセカンダリ ヘッダーを削除して、デフォルトのコンテンツに戻します。
mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);
カスタム コントロールの位置
Secondary header
このカスタム コントロール位置を使用するには、位置 CustomControlPosition.SECONDARY_HEADER を setCustomControl に渡します。
デフォルトでは、ナビゲーション モードの画面レイアウトには、メインヘッダーの下にサブヘッダーを配置する場所が用意されています。このサブヘッダーは、車線案内など、必要な場合に表示されます。アプリは、カスタム コンテンツにレイアウトのこのセカンダリ ヘッダー位置を使用できます。この機能を使用すると、デフォルトのセカンダリ ヘッダー コンテンツがすべてコントロールでカバーされます。ナビゲーション ビューに背景がある場合、その背景はそのまま残り、セカンダリ ヘッダーで覆われます。アプリがカスタム コントロールを削除すると、デフォルトのセカンダリ ヘッダーがその場所に表示されます。
カスタムのセカンダリ ヘッダーの位置は、上端がプライマリ ヘッダーの下端に揃えられます。このポジションは portrait mode でのみサポートされています。landscape mode では、セカンダリ ヘッダーは使用できず、レイアウトは変更されません。
下部開始
このカスタム コントロール位置を使用するには、位置 CustomControlPosition.BOTTOM_START_BELOW を setCustomControl に渡します。
このカスタム コントロールの位置は、地図の左下隅です。portrait mode と landscape mode の両方で、到着予定カードやカスタム フッターの上(どちらも存在しない場合は地図の下部)に配置されます。また、再センタリング ボタンや Google ロゴなどの Navigation SDK 要素は、カスタム コントロール ビューの高さに合わせて上に移動します。このコントロールは、表示されている地図の境界内に配置されるため、地図の下端または開始端にパディングを追加すると、このコントロールの位置も変更されます。
下端
このカスタム コントロール位置を使用するには、位置 CustomControlPosition.BOTTOM_END_BELOW を setCustomControl に渡します。
このカスタム コントロールの位置は、地図の下端の角です。portrait mode では、到着予定カードやカスタム フッターの上(どちらも存在しない場合は地図の下部)に配置されますが、landscape mode では地図の下部に配置されます。終了側(LTR では右側)に表示されるナビゲーション SDK 要素は、カスタム コントロール ビューの高さに合わせて上に移動します。このコントロールは、表示されている地図の境界内に配置されるため、地図の下端または右端にパディングを追加すると、このコントロールの位置も変わります。
フッター
このカスタム コントロール位置を使用するには、位置 CustomControlPosition.FOOTER を setCustomControl に渡します。
このカスタム コントロール位置は、カスタム フッタービュー用に設計されています。Nav SDK の ETA カードが表示されている場合、このコントロールはその上に表示されます。それ以外の場合、コントロールは地図の下部に揃えられます。BOTTOM_START_BELOW カスタム コントロールや BOTTOM_END_BELOW カスタム コントロールとは異なり、このコントロールは地図の表示境界の外側に配置されます。つまり、地図にパディングを追加しても、このコントロールの位置は変わりません。
portrait mode では、カスタム フッターは全幅です。CustomControlPosition.BOTTOM_START_BELOW と CustomControlPosition.BOTTOM_END_BELOW の両方の位置にあるカスタム コントロールと、再センタリング ボタンや Google ロゴなどのナビゲーション SDK UI 要素は、カスタム コントロール フッターの上に配置されます。シェブロンのデフォルトの位置は、カスタム フッターの高さを考慮しています。
landscape mode では、カスタム フッターは半分の幅で、Nav SDK の ETA カードと同様に開始側(LTR では左側)に配置されます。CustomControlPosition.BOTTOM_START_BELOW 位置のカスタム コントロールと、再センタリング ボタンや Google ロゴなどの Navigation SDK UI 要素は、カスタム コントロール フッターの上に配置されます。CustomControlPosition.BOTTOM_END_BELOW 位置のカスタム コントロールと、終了側(LTR の右側)に沿ったナビゲーション SDK UI 要素は、地図の下部に揃えられたままになります。カスタム フッターが存在する場合、シェブロンのデフォルトの位置は変わりません。これは、フッターが地図の端まで拡張されないためです。
CustomControlPosition.BOTTOM_START_BELOW と CustomControlPosition.BOTTOM_END_BELOW の位置にあるカスタム コントロール、および再センタリング ボタンや Google ロゴなどの Navigation SDK UI 要素は、カスタム コントロール フッターの上に配置されます。
地図 UI アクセサリー
Navigation SDK for Android には、ナビゲーション中に表示される UI アクセサリーが用意されています。これは、Google マップ(Android 版)アプリに表示されるものと同様です。このセクションで説明するように、これらのコントロールの表示 / 非表示や外観を調整できます。ここで行った変更は、次回のナビゲーション セッション中に反映されます。
ナビゲーション UI の許容される変更に関するガイドラインについては、ポリシーページをご覧ください。
コードを表示する
目的地のハイライト表示と入り口
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 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 for 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));
}
NavigationView と同様に、ライフサイクル イベントを DirectionsListView に転送してください。次に例を示します。
protected void onResume() {
super.onResume();
directionsListView.onResume();
}
別の経路を非表示にする
ユーザー インターフェースに表示される情報が多すぎる場合は、代替ルートの表示数をデフォルト(2 つ)より減らすか、代替ルートをまったく表示しないことで、表示される情報を減らすことができます。このオプションは、次のいずれかの列挙値を使用して RoutingOptions.alternateRoutesStrategy() メソッドを呼び出すことで、ルートを取得する前に構成できます。
| 列挙値 | 説明 |
|---|---|
| AlternateRoutesStrategy.SHOW_ALL | デフォルト。最大 2 つの代替ルートが表示されます。 |
| AlternateRoutesStrategy.SHOW_ONE | 別のルートを 1 つ表示します(利用可能な場合)。 |
| 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 です。
- ルートの進行状況バーの高さは固定されています。小型デバイスの垂直方向のスペース制限に対応するため、ルートの進行状況バーの表示と高さは、画面の高さに指定されたブレークポイントに基づいて調整されます。これらのブレークポイントは、デバイスの向きや、地図が画面上で実際に占めるスペースとは無関係です。
- ルートの進行状況バーがターンカードや他のナビゲーション UI 要素と重なる場合は、それらの要素の下に表示されます。
| 画面の高さ | トリップの進行状況バーの表示 | 移動の進行状況バーの高さ | ルートの進行状況バーの Y 軸の位置 |
|---|---|---|---|
| 小: 0 dp ~ 551 dp | 非表示 | なし | なし |
| 中: 552 dp ~ 739 dp | 表示 | 130 dp | 開始側のコントロール(速度計、Google ロゴ、[中心を再設定] ボタン)の上 |
| 大: 740 dp 以上 | 表示 | 290 dp | 開始側のコントロール(速度計、Google ロゴ、[中心を再設定] ボタン)の上 |
コンパス
Navigation SDK を使用して、特定の状況下で地図の右上にコンパス グラフィックを表示することができます。ユーザーがコンパスをクリックすると、カメラの方向がゼロの位置(デフォルトの向き)に戻る様子がアニメーション表示されてから、間もなくコンパスが消えます。
ナビゲーションが有効で、カメラモードが「追従」に設定されている場合、コンパスは表示されたままになり、コンパスをタップすると、傾斜カメラと概要カメラの視点が切り替わります。
ドライバーの注意散漫を防ぐため、ヘッダー(ポートレート モード)が拡大してコンパスのデフォルトの位置と競合する場合でも、コンパスは同じ位置に留まります。セカンダリ ヘッダーのカスタム コントロールまたはヘッダー アクセサリー ビューを追加すると、UI の競合を避けるためにコンパスが非表示になります。
コンパスは、日中モードと夜間モード、ダークモードに対応しています。
コンパスはデフォルトで有効になっています。コンパスを有効にするかどうかは、GoogleMapOptions クラスの compassEnabled メソッドを使用して設定できます。
建物の 3D 表示をオフにする
パフォーマンスに制約のあるデバイスでは、GoogleMap.setBuildingsEnabled(false) を呼び出すことで、建物の 3D 表示をオフにできます。
Prompt Visibility API(試験運用版)
Prompt Visibility API を使用すると、Navigation SDK によって生成される UI 要素と独自のカスタム UI 要素との競合を回避できます。これには、Navigation SDK の UI 要素が表示される直前と、要素が削除された直後にコールバックを受け取るリスナーを追加します。コードサンプルを含む詳細については、リアルタイムの運行状況を構成するページの Prompt Visibility API セクションをご覧ください。