নেভিগেশন UI পরিবর্তন করুন

অ্যান্ড্রয়েডের জন্য নেভিগেশন SDK ব্যবহার করে, আপনি বিল্ট-ইন UI নিয়ন্ত্রণ এবং উপাদানগুলির মধ্যে কোনটি মানচিত্রে উপস্থিত হবে তা নির্ধারণ করে আপনার মানচিত্রের সাথে ব্যবহারকারীর অভিজ্ঞতা পরিবর্তন করতে পারেন৷ আপনি নেভিগেশন UI এর ভিজ্যুয়াল চেহারাও সামঞ্জস্য করতে পারেন। নেভিগেশন UI-তে গ্রহণযোগ্য পরিবর্তনের নির্দেশিকাগুলির জন্য নীতি পৃষ্ঠাটি পড়ুন।

এই নথিটি বর্ণনা করে কিভাবে আপনার মানচিত্রের ইউজার ইন্টারফেস দুটি উপায়ে পরিবর্তন করতে হয়:

মানচিত্র UI নিয়ন্ত্রণ

মানচিত্র UI নিয়ন্ত্রণগুলি সঠিক অবস্থান নিশ্চিত করতে নেভিগেশন ভিউতে কাস্টম UI উপাদানগুলি রাখার প্রস্তাবিত উপায়। যখন অন্তর্নির্মিত লেআউট পরিবর্তন হয়, তখন Android এর জন্য নেভিগেশন SDK স্বয়ংক্রিয়ভাবে আপনার কাস্টম নিয়ন্ত্রণগুলিকে পুনঃস্থাপন করে৷ আপনি প্রতিটি অবস্থানের জন্য একবারে একটি কাস্টম নিয়ন্ত্রণ দৃশ্য সেট করতে পারেন। যদি আপনার ডিজাইনের একাধিক UI উপাদানের প্রয়োজন হয়, আপনি সেগুলিকে একটি ViewGroup রাখতে পারেন এবং এটি setCustomControl পদ্ধতিতে পাস করতে পারেন।

setCustomControl পদ্ধতিটি CustomControlPosition enum- এ সংজ্ঞায়িত পজিশন প্রদান করে:

  • SECONDARY_HEADER (শুধুমাত্র প্রতিকৃতি মোডে প্রদর্শিত হয়)
  • BOTTOM_START_BELOW
  • BOTTOM_END_BELOW
  • FOOTER
প্রতিকৃতি অভিযোজন জন্য কাস্টম নিয়ন্ত্রণ অবস্থান.
প্রতিকৃতি অভিযোজন জন্য কাস্টম নিয়ন্ত্রণ অবস্থান
ল্যান্ডস্কেপ অভিযোজন জন্য কাস্টম নিয়ন্ত্রণ অবস্থান.
ল্যান্ডস্কেপ অভিযোজন জন্য কাস্টম নিয়ন্ত্রণ অবস্থান

একটি কাস্টম নিয়ন্ত্রণ যোগ করুন

  1. কাস্টম UI উপাদান বা ভিউগ্রুপ দিয়ে একটি অ্যান্ড্রয়েড ভিউ তৈরি করুন।
  2. XML স্ফীত করুন বা দৃশ্যের একটি উদাহরণ পেতে কাস্টম ভিউটি ইনস্ট্যান্টিয়েট করুন।
  3. CustomControlPosition enum থেকে নির্বাচিত কাস্টম নিয়ন্ত্রণ অবস্থানের সাথে NavigationView.setCustomControl বা SupportNavigationFragment.setCustomControl ব্যবহার করুন।

    নীচের উদাহরণটি একটি খণ্ড তৈরি করে এবং সেকেন্ডারি হেডার অবস্থানে একটি কাস্টম নিয়ন্ত্রণ যোগ করে।

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

একটি কাস্টম নিয়ন্ত্রণ সরান

একটি কাস্টম নিয়ন্ত্রণ সরাতে, একটি null ভিউ প্যারামিটার এবং নির্বাচিত কাস্টম নিয়ন্ত্রণ অবস্থান সহ setCustomControl পদ্ধতিতে কল করুন।

উদাহরণস্বরূপ, নিম্নোক্ত স্নিপেট যেকোনো কাস্টম সেকেন্ডারি হেডার সরিয়ে দেয় এবং ডিফল্ট সামগ্রীতে ফিরে আসে:

mNavFragment.setCustomControl(null, CustomControlPosition.SECONDARY_HEADER);

কাস্টম নিয়ন্ত্রণ অবস্থান

সেকেন্ডারি হেডার

প্রতিকৃতি অভিযোজনের জন্য সেকেন্ডারি হেডার কাস্টম নিয়ন্ত্রণ অবস্থান।
প্রতিকৃতি অভিযোজনের জন্য সেকেন্ডারি হেডার কাস্টম নিয়ন্ত্রণ অবস্থান

এই কাস্টম কন্ট্রোল পজিশন ব্যবহার করতে, CustomControlPosition.SECONDARY_HEADER setCustomControl এ পাস করুন।

ডিফল্টরূপে, নেভিগেশন মোডে স্ক্রীন লেআউটগুলি প্রাথমিক শিরোনামের নীচে অবস্থিত একটি সেকেন্ডারি হেডারের জন্য একটি অবস্থান প্রদান করে। এই গৌণ শিরোনামটি যখন প্রয়োজন হয় তখন উপস্থিত হয়, যেমন লেন নির্দেশিকা সহ। আপনার অ্যাপ কাস্টম কন্টেন্টের জন্য লেআউটের এই সেকেন্ডারি হেডার পজিশন ব্যবহার করতে পারে। আপনি যখন এই বৈশিষ্ট্যটি ব্যবহার করেন, তখন আপনার নিয়ন্ত্রণ যেকোনো ডিফল্ট সেকেন্ডারি হেডার সামগ্রী কভার করে। যদি আপনার নেভিগেশন ভিউয়ের একটি পটভূমি থাকে, তবে সেই পটভূমিটি সেকেন্ডারি হেডার দ্বারা আচ্ছাদিত জায়গায় থাকে। যখন আপনার অ্যাপ কাস্টম নিয়ন্ত্রণ সরিয়ে দেয়, তখন যেকোনো ডিফল্ট সেকেন্ডারি হেডার তার জায়গায় উপস্থিত হতে পারে।

কাস্টম সেকেন্ডারি হেডার পজিশন প্রাথমিক হেডারের নিচের প্রান্তের সাথে তার উপরের প্রান্তটিকে সারিবদ্ধ করে। এই অবস্থানটি শুধুমাত্র portrait mode সমর্থিত। landscape mode , সেকেন্ডারি হেডার অনুপলব্ধ, এবং লেআউট পরিবর্তন হয় না।

নীচে শুরু

পোর্ট্রেট অভিযোজন জন্য নীচের শুরু কাস্টম নিয়ন্ত্রণ অবস্থান.
পোর্ট্রেট অভিযোজন জন্য নীচের শুরু কাস্টম নিয়ন্ত্রণ অবস্থান
ল্যান্ডস্কেপ ওরিয়েন্টেশনের জন্য নীচে শুরু কাস্টম নিয়ন্ত্রণ অবস্থান।
ল্যান্ডস্কেপ ওরিয়েন্টেশনের জন্য নীচে শুরু কাস্টম নিয়ন্ত্রণ অবস্থান

এই কাস্টম কন্ট্রোল পজিশন ব্যবহার করতে, CustomControlPosition.BOTTOM_START_BELOW পজিশনটি পাস করুন। BOTTOM_START_BELOW setCustomControl করতে।

এই কাস্টম কন্ট্রোল পজিশনটি মানচিত্রের নিচের শুরুর কোণায় বসে। portrait mode এবং landscape mode উভয় ক্ষেত্রেই, এটি ETA কার্ড এবং/অথবা কাস্টম ফুটারের উপরে বসে (অথবা যদি না থাকে তবে মানচিত্রের নীচে), এবং পুনঃ-কেন্দ্র বোতাম এবং Google লোগো সহ Nav SDK উপাদানগুলি অ্যাকাউন্টে চলে যায় কাস্টম নিয়ন্ত্রণ দৃশ্যের উচ্চতার জন্য। এই নিয়ন্ত্রণটি দৃশ্যমান মানচিত্রের সীমানার মধ্যে অবস্থিত, তাই মানচিত্রের নীচে বা সূচনা প্রান্তে যোগ করা যেকোনো প্যাডিং এই নিয়ন্ত্রণের অবস্থানও পরিবর্তন করবে।

নীচের প্রান্ত

পোর্ট্রেট অভিযোজনের জন্য নীচের প্রান্তের কাস্টম নিয়ন্ত্রণ অবস্থান।
পোর্ট্রেট অভিযোজনের জন্য নীচের প্রান্তের কাস্টম নিয়ন্ত্রণ অবস্থান
ল্যান্ডস্কেপ স্থিতিবিন্যাস জন্য নীচের শেষ কাস্টম নিয়ন্ত্রণ অবস্থান.
ল্যান্ডস্কেপ স্থিতিবিন্যাস জন্য নীচের শেষ কাস্টম নিয়ন্ত্রণ অবস্থান

এই কাস্টম কন্ট্রোল পজিশন ব্যবহার করতে, CustomControlPosition.BOTTOM_END_BELOW পজিশনটি পাস করুন। BOTTOM_END_BELOW setCustomControl করতে।

এই কাস্টম কন্ট্রোল পজিশনটি মানচিত্রের নিচের প্রান্তের কোণায় বসে আছে। portrait mode , এটি ETA কার্ড এবং/অথবা কাস্টম ফুটারের উপরে বসে (অথবা মানচিত্রের নীচে যদি না থাকে), তবে landscape mode এটি মানচিত্রের নীচের সাথে সারিবদ্ধ থাকে৷ কাস্টম কন্ট্রোল ভিউয়ের উচ্চতার জন্য শেষ দিকে (LTR-এ ডান দিকে) দৃশ্যমান যেকোনো Nav SDK উপাদান। এই নিয়ন্ত্রণটি দৃশ্যমান মানচিত্রের সীমানার মধ্যে অবস্থিত, তাই মানচিত্রের নীচে বা শেষ প্রান্তে যোগ করা যেকোন প্যাডিং এই নিয়ন্ত্রণের অবস্থান পরিবর্তন করবে।

প্রতিকৃতি অভিযোজনের জন্য ফুটার কাস্টম নিয়ন্ত্রণ অবস্থান।
প্রতিকৃতি অভিযোজনের জন্য ফুটার কাস্টম নিয়ন্ত্রণ অবস্থান
ল্যান্ডস্কেপ স্থিতিবিন্যাস জন্য ফুটার কাস্টম নিয়ন্ত্রণ অবস্থান.
ল্যান্ডস্কেপ স্থিতিবিন্যাস জন্য ফুটার কাস্টম নিয়ন্ত্রণ অবস্থান

এই কাস্টম কন্ট্রোল পজিশন ব্যবহার করতে, CustomControlPosition.FOOTER কে setCustomControl এ পাস করুন।

এই কাস্টম কন্ট্রোল পজিশন একটি কাস্টম ফুটার ভিউ এর জন্য ডিজাইন করা হয়েছে। যদি Nav SDK ETA কার্ডটি দৃশ্যমান হয়, তাহলে এই নিয়ন্ত্রণটি এর উপরে বসে। যদি না হয়, নিয়ন্ত্রণটি মানচিত্রের নীচের সাথে সারিবদ্ধ করা হয়৷ BOTTOM_START_BELOW এবং BOTTOM_END_BELOW কাস্টম নিয়ন্ত্রণের বিপরীতে, এই নিয়ন্ত্রণটি দৃশ্যমান মানচিত্রের সীমানার বাইরে অবস্থান করে, যার মানে মানচিত্রে যোগ করা যেকোনো প্যাডিং এই নিয়ন্ত্রণের অবস্থান পরিবর্তন করবে না।

portrait mode , কাস্টম ফুটারটি সম্পূর্ণ প্রস্থ। CustomControlPosition.BOTTOM_START_BELOW এবং CustomControlPosition.BOTTOM_END_BELOW উভয় অবস্থানেই কাস্টম নিয়ন্ত্রণ, সেইসাথে রি-সেন্টার বোতাম এবং Google লোগোর মতো Nav SDK UI উপাদান, কাস্টম কন্ট্রোল ফুটারের উপরে অবস্থিত। শেভরনের ডিফল্ট অবস্থান কাস্টম ফুটারের উচ্চতা বিবেচনা করে।

landscape mode , কাস্টম ফুটারটি অর্ধেক প্রস্থ এবং প্রারম্ভিক দিকের (LTR তে বাম দিকে) সারিবদ্ধ, ঠিক Nav SDK ETA কার্ডের মতো৷ CustomControlPosition.BOTTOM_START_BELOW পজিশনে কাস্টম কন্ট্রোল। BOTTOM_START_BELOW অবস্থান এবং Nav SDK UI উপাদান যেমন রি-সেন্টার বোতাম এবং Google লোগো কাস্টম কন্ট্রোল পাদলেখের উপরে অবস্থান করে। CustomControlPosition.BOTTOM_END_BELOW পজিশনে কাস্টম কন্ট্রোল। BOTTOM_END_BELOW অবস্থান এবং যেকোনও Nav SDK UI উপাদানগুলি প্রান্তের পাশে (LTR তে ডান দিকে) মানচিত্রের নীচের সাথে সারিবদ্ধ থাকে। শেভরনের ডিফল্ট অবস্থান পরিবর্তন হয় না যখন একটি কাস্টম ফুটার উপস্থিত থাকে কারণ ফুটারটি মানচিত্রের শেষ দিকে প্রসারিত হয় না।

CustomControlPosition.BOTTOM_START_BELOW এবং CustomControlPosition.BOTTOM_END_BELOW পজিশনে কাস্টম কন্ট্রোল, সেইসাথে রি-সেন্টার বোতাম এবং Google লোগোর মতো Nav SDK UI উপাদানগুলি কাস্টম কন্ট্রোল ফুটারের উপরে অবস্থিত।

ম্যাপ UI আনুষাঙ্গিক

অ্যান্ড্রয়েডের জন্য ন্যাভিগেশন SDK UI আনুষাঙ্গিক সরবরাহ করে যা নেভিগেশনের সময় Android অ্যাপ্লিকেশনের জন্য Google মানচিত্রের মতোই দেখা যায়। এই বিভাগে বর্ণিত হিসাবে আপনি এই নিয়ন্ত্রণগুলির দৃশ্যমানতা বা চাক্ষুষ চেহারা সামঞ্জস্য করতে পারেন। আপনি এখানে যে পরিবর্তনগুলি করেছেন তা পরবর্তী নেভিগেশন সেশনে প্রতিফলিত হবে৷

নেভিগেশন UI-তে গ্রহণযোগ্য পরিবর্তনের নির্দেশিকাগুলির জন্য নীতি পৃষ্ঠাটি পড়ুন।

কোডটি দেখুন

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));

ট্রাফিক লাইট এবং স্টপ সাইন সক্রিয় করুন

আপনি সক্রিয় নেভিগেশন চলাকালীন মানচিত্রে ট্র্যাফিক লাইটের প্রদর্শন এবং স্টপ চিহ্নগুলি সক্ষম করতে পারেন, যা রুট এবং ট্রিপ ম্যানুভারগুলির জন্য অতিরিক্ত প্রসঙ্গ সরবরাহ করে।

ডিফল্টরূপে, নেভিগেশন SDK-এ ট্র্যাফিক লাইট এবং স্টপ সাইনগুলি অক্ষম থাকে৷ এই বৈশিষ্ট্যটি সক্ষম করতে, প্রতিটি বৈশিষ্ট্যের জন্য স্বতন্ত্রভাবে DisplayOptions কল করুন।

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

কাস্টম মার্কার যোগ করুন

Android এর জন্য নেভিগেশন SDK এখন মার্কারগুলির জন্য Google মানচিত্র API ব্যবহার করে৷ আরও তথ্যের জন্য মানচিত্র API ডকুমেন্টেশনে যান।

ভাসমান পাঠ্য

আপনি আপনার অ্যাপের যেকোনো জায়গায় ভাসমান পাঠ্য যোগ করতে পারেন, যদি এটি Google অ্যাট্রিবিউশনকে কভার না করে। ন্যাভিগেশন SDK মানচিত্রের অক্ষাংশ/দ্রাঘিমাংশে বা লেবেলে পাঠ্যকে অ্যাঙ্করিং সমর্থন করে না। আরও তথ্যের জন্য তথ্য উইন্ডোতে যান।

গতি সীমা প্রদর্শন করুন

আপনি প্রোগ্রামগতভাবে গতি সীমা আইকন দেখাতে বা লুকাতে পারেন। গতিসীমা আইকন প্রদর্শন বা আড়াল করতে NavigationView.setSpeedLimitIconEnabled() বা SupportNavigationFragment.setSpeedLimitIconEnabled() ব্যবহার করুন। যখন সক্রিয় করা হয়, গতি সীমা আইকন নির্দেশিকা চলাকালীন নীচের কোণায় প্রদর্শিত হয়। আইকনটি গাড়িটি যে রাস্তায় চলাচল করছে তার গতিসীমা প্রদর্শন করে। আইকনটি শুধুমাত্র সেই স্থানেই প্রদর্শিত হবে যেখানে নির্ভরযোগ্য গতি সীমা ডেটা উপলব্ধ।

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

রিস্টার বোতামটি প্রদর্শিত হলে গতি সীমা আইকনটি সাময়িকভাবে লুকানো থাকে।

রাতের মোড সেট করুন

আপনি প্রোগ্রাম্যাটিকভাবে রাতের মোডের আচরণ নিয়ন্ত্রণ করতে পারেন। নাইট মোড চালু বা বন্ধ করতে NavigationView.setForceNightMode() বা SupportNavigationFragment.setForceNightMode() ব্যবহার করুন বা Android এর জন্য নেভিগেশন SDK কে এটি নিয়ন্ত্রণ করতে দিন।

  • 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);

ট্রিপ অগ্রগতি বার

ট্রিপ অগ্রগতি বার নেভিগেশন যোগ করা হয়েছে.

ট্রিপ প্রগ্রেস বার হল একটি উল্লম্ব বার যা নেভিগেশন শুরু হলে মানচিত্রের ডান প্রান্তে প্রদর্শিত হয়। সক্রিয় করা হলে, এটি ব্যবহারকারীর গন্তব্য এবং বর্তমান অবস্থান সহ একটি সম্পূর্ণ ভ্রমণের জন্য একটি ওভারভিউ প্রদর্শন করে৷

জুম ইন করার প্রয়োজন ছাড়াই ব্যবহারকারীদের যেকোনো আসন্ন সমস্যা, যেমন ট্রাফিকের মতো দ্রুত অনুমান করার ক্ষমতা প্রদান করে। প্রয়োজনে তারা ট্রিপটি পুনরায় রুট করতে পারে। ব্যবহারকারী যদি ট্রিপটিকে পুনরায় রুট করেন, তাহলে অগ্রগতি বারটি রিসেট হবে যেন সেই বিন্দু থেকে একটি নতুন ট্রিপ শুরু হয়েছে।

ট্রিপ প্রগ্রেস বার নিম্নলিখিত স্থিতি সূচকগুলি প্রদর্শন করে:

  • পথ কেটে গেছে —যাত্রার অতিবাহিত অংশ।

  • বর্তমান অবস্থান — ট্রিপে ব্যবহারকারীর বর্তমান অবস্থান।

  • ট্র্যাফিক অবস্থা - আসন্ন ট্র্যাফিকের অবস্থা।

  • চূড়ান্ত গন্তব্য —শেষ ভ্রমণের গন্তব্য।

NavigationView বা SupportNavigationFragment-setTripProgressBarEnabled() পদ্ধতিতে কল করে ট্রিপ অগ্রগতি বার সক্রিয় করুন। যেমন:

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