باستخدام حزمة تطوير البرامج Navigation SDK لنظام التشغيل Android، يمكنك تعديل تجربة المستخدم مع خريطتك من خلال تحديد عناصر واجهة المستخدم وعناصر التحكّم المضمّنة التي تظهر على الخريطة. يمكنك أيضًا تعديل المظهر المرئي لواجهة مستخدم التنقّل. يُرجى الرجوع إلى صفحة السياسات للحصول على إرشادات حول التعديلات المقبولة على واجهة مستخدم التنقّل.
يوضّح هذا المستند كيفية تعديل واجهة مستخدِم الخريطة بطريقتَين:
عناصر التحكّم في واجهة المستخدم في الخريطة
عناصر التحكّم في واجهة المستخدم في الخريطة هي الطريقة المُقترَحة لوضع عناصر واجهة المستخدم المخصّصة في طريقة عرض التنقّل لضمان وضعها بشكلٍ صحيح. عند تغيير التنسيق المضمّن، تعيد
Navigation SDK لنظام التشغيل Android ضبط موضع عناصر التحكّم المخصّصة تلقائيًا. يمكنك ضبط عرض واحد لعنصر التحكّم المخصّص في كل مرة
لكل موضع. إذا كان تصميمك يتطلّب عناصر واجهة مستخدم متعددة، يمكنك وضع
هذه العناصر في ViewGroup
ونقلها إلى طريقة setCustomControl
.
تقدّم setCustomControl
الطريقة
المواضع كما هو محدّد في CustomControlPosition
التعداد:
SECONDARY_HEADER
(يظهر في الوضع العمودي فقط)BOTTOM_START_BELOW
BOTTOM_END_BELOW
FOOTER


إضافة عنصر تحكّم مخصّص
- أنشئ عرض Android باستخدام عنصر واجهة المستخدم المخصّص أو ViewGroup.
- وسِّع ملف XML أو أنشئ مثيلًا للعرض المخصّص للحصول على مثيل للملف.
استخدِم
NavigationView.setCustomControl
أوSupportNavigationFragment.setCustomControl
مع موضع عنصر التحكّم المخصّص الذي تم اختياره منCustomControlPosition
enum.ينشئ المثال أدناه مقتطفًا ويضيف عنصر تحكّم مخصّصًا في موضع العنوان الثانوي.
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
، يتم محاذاة العنوان مع أسفل الخريطة. يتم نقل أي عناصر من حزمة تطوير البرامج (SDK) لنظام التنقّل تظهر على الجانب الأيمن (الجانب الأيمن في اتجاه القراءة من اليمين إلى اليسار) للأعلى لتناسب ارتفاع عرض عناصر التحكّم المخصّصة. يتم وضع عنصر التحكّم هذا داخل حدود الخريطة المرئية، لذا فإنّ أي مساحة فارغة تُضاف إلى أسفل الخريطة أو حوافّها النهائية ستؤدي أيضًا إلى تغيير موضع عنصر التحكّم هذا.
التذييل


لاستخدام موضع التحكّم المخصّص هذا، نقْل الموضع CustomControlPosition.FOOTER
إلى setCustomControl
.
تم تصميم موضع التحكّم المخصّص هذا لعرض تذييل مخصّص. إذا كانت بطاقة وقت الوصول المقدَّر لحزمة Nav SDK مرئية، يظهر عنصر التحكّم هذا فوقها. وإذا لم يكن الأمر كذلك، يتم محاذاة عنصر التحكّم مع أسفل الخريطة. على عكس عناصر التحكّم المخصّصة BOTTOM_START_BELOW
وBOTTOM_END_BELOW
، يتم وضع عنصر التحكّم هذا خارج حدود الخريطة المرئية، ما يعني أنّ أيّ مساحة تم إضافتها إلى الخريطة لن تغيّر موضع عنصر التحكّم هذا.
في portrait mode
، يكون التذييل المخصّص بالعرض الكامل. يتم وضع عناصر التحكّم المخصّصة في موضعي CustomControlPosition.BOTTOM_START_BELOW
وCustomControlPosition.BOTTOM_END_BELOW
، بالإضافة إلى عناصر واجهة مستخدم Nav SDK، مثل زر إعادة التوسيع وشعار Google، فوق تذييل عناصر التحكّم المخصّصة. يراعي الموضع التلقائي للسهم المتّجه للأعلى أو للأسفل ارتفاع التذييل المخصّص.
في landscape mode
، يكون التذييل المخصّص بنصف العرض ومحاذاً لجانب البداية (الجانب الأيسر بتنسيق RTL)، تمامًا مثل بطاقة وقت الوصول المقدَّمة من حزمة تطوير البرامج (SDK) لنظام التنقّل. يتم وضع عناصر التحكّم المخصّصة في موضع CustomControlPosition.BOTTOM_START_BELOW
وعناصر واجهة مستخدم حزمة تطوير البرامج (SDK) لنظام التنقّل، مثل زر إعادة التوسيع وشعار Google، فوق تذييل عناصر التحكّم المخصّصة. تظل عناصر التحكّم المخصّصة في موضع CustomControlPosition.BOTTOM_END_BELOW
وأي عناصر واجهة مستخدم في حزمة تطوير البرامج (SDK) لنظام التنقّل على طول الجانب السفلي (الجانب الأيمن في اتجاه الكتابة من اليمين إلى اليسار) محاذية لأسفل الخريطة. لا يتغيّر الموضع التلقائي لسهم الالتفاف عند توفّر تذييل مخصّص لأنّ التذييل لا يمتد إلى الجانب الأيمن من الخريطة.
يتم وضع عناصر التحكّم المخصّصة في مواضع CustomControlPosition.BOTTOM_START_BELOW
وCustomControlPosition.BOTTOM_END_BELOW
، بالإضافة إلى عناصر واجهة مستخدم Nav SDK، مثل زر إعادة التوسيع وشعار Google، فوق تذييل عناصر التحكّم المخصّصة.
ملحقات واجهة مستخدِم "خرائط Google"
توفّر حزمة تطوير البرامج (SDK) للتنقّل على أجهزة Android ملحقات واجهة مستخدِم تظهر أثناء التنقّل، وهي مشابهة لتلك المتوفّرة في تطبيق "خرائط Google" لأجهزة Android. يمكنك ضبط مستوى ظهور عناصر التحكّم هذه أو مظهرها كما هو описан في هذا القسم. تظهر التغييرات التي تُجريها هنا أثناء جلسة التنقّل التالية.
يُرجى الرجوع إلى صفحة "السياسات" للحصول على إرشادات حول تعديلات المقبولة على واجهة مستخدِم التنقّل.
عرض الرمز
إظهار/إخفاء رمز Java لنشاط التنقّل
package com.example.navsdkcustomization; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.GoogleMap.CameraPerspective; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.libraries.navigation.ListenableResultFuture; import com.google.android.libraries.navigation.NavigationApi; import com.google.android.libraries.navigation.Navigator; import com.google.android.libraries.navigation.SimulationOptions; import com.google.android.libraries.navigation.StylingOptions; import com.google.android.libraries.navigation.SupportNavigationFragment; import com.google.android.libraries.navigation.Waypoint; /** An activity that displays a map and a customized navigation UI. */ public class NavigationActivityCustomization extends AppCompatActivity { private static final String TAG = NavigationActivityCustomization.class.getSimpleName(); private Navigator mNavigator; private SupportNavigationFragment mNavFragment; private GoogleMap mMap; // Define the Sydney Opera House by specifying its place ID. private static final String SYDNEY_OPERA_HOUSE = "ChIJ3S-JXmauEmsRUcIaWtf4MzE"; // Set fields for requesting location permission. private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1; private boolean mLocationPermissionGranted; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize the Navigation SDK. initializeNavigationSdk(); } /** * Starts the Navigation SDK and sets the camera to follow the device's location. Calls the * navigateToPlace() method when the navigator is ready. */ private void initializeNavigationSdk() { /* * Request location permission, so that we can get the location of the * device. The result of the permission request is handled by a callback, * onRequestPermissionsResult. */ if (ContextCompat.checkSelfPermission( this.getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { mLocationPermissionGranted = true; } else { ActivityCompat.requestPermissions( this, new String[] {android.Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); } if (!mLocationPermissionGranted) { displayMessage( "Error loading Navigation SDK: " + "The user has not granted location permission."); return; } // Get a navigator. NavigationApi.getNavigator( this, new NavigationApi.NavigatorListener() { /** Sets up the navigation UI when the navigator is ready for use. */ @Override public void onNavigatorReady(Navigator navigator) { displayMessage("Navigator ready."); mNavigator = navigator; mNavFragment = (SupportNavigationFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_fragment); // Get the map. mNavFragment.getMapAsync( new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap map) { mMap = map; // Navigate to a place, specified by Place ID. navigateToPlace(SYDNEY_OPERA_HOUSE); } }); } /** * Handles errors from the Navigation SDK. * * @param errorCode The error code returned by the navigator. */ @Override public void onError(@NavigationApi.ErrorCode int errorCode) { switch (errorCode) { case NavigationApi.ErrorCode.NOT_AUTHORIZED: displayMessage( "Error loading Navigation SDK: Your API key is " + "invalid or not authorized to use the Navigation SDK."); break; case NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED: displayMessage( "Error loading Navigation SDK: User did not accept " + "the Navigation Terms of Use."); break; case NavigationApi.ErrorCode.NETWORK_ERROR: displayMessage("Error loading Navigation SDK: Network error."); break; case NavigationApi.ErrorCode.LOCATION_PERMISSION_MISSING: displayMessage( "Error loading Navigation SDK: Location permission " + "is missing."); break; default: displayMessage("Error loading Navigation SDK: " + errorCode); } } }); } /** Customizes the navigation UI and the map. */ private void customizeNavigationUI() { // Set custom colors for the navigator. 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)); mMap.setTrafficEnabled(false); // Place a marker at the final destination. if (mNavigator.getCurrentRouteSegment() != null) { LatLng destinationLatLng = mNavigator.getCurrentRouteSegment().getDestinationLatLng(); Bitmap destinationMarkerIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_person_pin_48dp); mMap.addMarker( new MarkerOptions() .position(destinationLatLng) .icon(BitmapDescriptorFactory.fromBitmap(destinationMarkerIcon)) .title("Destination marker")); // Listen for a tap on the marker. mMap.setOnMarkerClickListener( new GoogleMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { displayMessage( "Marker tapped: " + marker.getTitle() + ", at location " + marker.getPosition().latitude + ", " + marker.getPosition().longitude); // The event has been handled. return true; } }); } // Set the camera to follow the device location with 'TILTED' driving view. mMap.followMyLocation(CameraPerspective.TILTED); } /** * Requests directions from the user's current location to a specific place (provided by the * Google Places API). */ private void navigateToPlace(String placeId) { Waypoint destination; try { destination = Waypoint.builder().setPlaceIdString(placeId).build(); } catch (Waypoint.UnsupportedPlaceIdException e) { displayMessage("Error starting navigation: Place ID is not supported."); return; } // Create a future to await the result of the asynchronous navigator task. ListenableResultFuture<Navigator.RouteStatus> pendingRoute = mNavigator.setDestination(destination); // Define the action to perform when the SDK has determined the route. pendingRoute.setOnResultListener( new ListenableResultFuture.OnResultListener<Navigator.RouteStatus>() { @Override public void onResult(Navigator.RouteStatus code) { switch (code) { case OK: // Hide the toolbar to maximize the navigation UI. if (getActionBar() != null) { getActionBar().hide(); } // Customize the navigation UI. customizeNavigationUI(); // Enable voice audio guidance (through the device speaker). mNavigator.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE); // Simulate vehicle progress along the route for demo/debug builds. if (BuildConfig.DEBUG) { mNavigator .getSimulator() .simulateLocationsAlongExistingRoute( new SimulationOptions().speedMultiplier(5)); } // Start turn-by-turn guidance along the current route. mNavigator.startGuidance(); break; // Handle error conditions returned by the navigator. case NO_ROUTE_FOUND: displayMessage("Error starting navigation: No route found."); break; case NETWORK_ERROR: displayMessage("Error starting navigation: Network error."); break; case ROUTE_CANCELED: displayMessage("Error starting navigation: Route canceled."); break; default: displayMessage("Error starting navigation: " + String.valueOf(code)); } } }); } /** Handles the result of the request for location permissions. */ @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { mLocationPermissionGranted = false; switch (requestCode) { case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: { // If request is canceled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { mLocationPermissionGranted = true; } } } } /** * Shows a message on screen and in the log. Used when something goes wrong. * * @param errorMessage The message to display. */ private void displayMessage(String errorMessage) { Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show(); Log.d(TAG, errorMessage); } }
تعديل عنوان التنقّل
استخدِم رمزي
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));
تفعيل إشارات المرور وعلامات التوقف
يمكنك تفعيل عرض إشارات المرور وعلامات التوقف في الخريطة أثناء التنقّل النشط، ما يقدّم سياقًا إضافيًا للمسارات و maneuvers الرحلة.
تكون إشارات المرور وعلامات التوقف غير مفعَّلة تلقائيًا في
Navigation SDK. لتفعيل هذه الميزة، اتصل بالرقم
DisplayOptions
لكل ميزة بشكل مستقل.
DisplayOptions displayOptions =
new DisplayOptions().showTrafficLights(true).showStopSigns(true);
إضافة علامات مخصّصة
تستخدم حزمة تطوير البرامج للتنقّل على أجهزة Android الآن واجهات برمجة تطبيقات "خرائط Google" للعلامات. انتقِل إلى مستندات Maps API للحصول على مزيد من المعلومات.
النص العائم
يمكنك إضافة نص عائم في أي مكان في تطبيقك، شرط ألا يغطي إحالة Google. لا تتيح حزمة تطوير البرامج Navigation SDK تثبيت النص بخط العرض/خط الطول على الخريطة أو بعلامة. انتقِل إلى نوافذ ملفّات معلومة للحصول على المزيد من المعلومات.
عرض حدّ السرعة
يمكنك إظهار رمز الحدّ الأقصى للسرعة أو إخفائه آليًا. استخدِم
NavigationView.setSpeedLimitIconEnabled()
أو
SupportNavigationFragment.setSpeedLimitIconEnabled()
لعرض رمز الحد الأقصى للسرعة أو إخفائه. عند تفعيل ميزة "الحدّ الأقصى للسرعة"،
يظهر رمزها في أحد الزوايا السفلية أثناء التوجيه. يعرض الرمز الحد الأقصى للسرعة
للطريق التي تسير عليها المركبة. لا يظهر الرمز إلا في المواقع الجغرافية
التي تتوفّر فيها بيانات موثوقة لحدود السرعة.
// Display the Speed Limit icon
mNavFragment.setSpeedLimitIconEnabled(true);
يتم إخفاء رمز الحد الأقصى للسرعة مؤقتًا عند عرض زر إعادة الضبط.
ضبط الوضع الليلي
يمكنك التحكّم في سلوك الوضع الليلي آليًا. استخدِم رمز
NavigationView.setForceNightMode()
أو
SupportNavigationFragment.setForceNightMode()
لتفعيل الوضع الليلي أو إيقافه، أو اسمح لحزمة Navigation SDK لنظام التشغيل Android
بالتحكّم فيه.
AUTO
السماح لحزمة تطوير البرامج (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()
method
على
NavigationView
أو
SupportNavigationFragment.
على سبيل المثال:
// Enable the trip progress bar.
mNavFragment.setTripProgressBarEnabled(true);