মানচিত্র আঁকুন

নিম্নলিখিত টেমপ্লেটগুলি ব্যবহার করে নেভিগেশন, পয়েন্ট অফ ইন্টারেস্ট (POI), এবং আবহাওয়ার অ্যাপগুলি একটি Surface অ্যাক্সেস করার মাধ্যমে মানচিত্র আঁকতে পারে।

নিম্নলিখিত টেমপ্লেটগুলি ব্যবহার করতে হলে, আপনার অ্যাপকে অবশ্যই AndroidManifest.xml ফাইলের <uses-permission> এলিমেন্টে এই সংশ্লিষ্ট পারমিশনগুলির মধ্যে একটি ঘোষণা করতে হবে।

টেমপ্লেট অনুমতি নির্দেশনা
NavigationTemplate androidx.car.app.NAVIGATION_TEMPLATES নেভিগেশন
MapWithContentTemplate

androidx.car.app.NAVIGATION_TEMPLATES

অথবা,

androidx.car.app.MAP_TEMPLATES

নেভিগেশন , দর্শনীয় স্থান , আবহাওয়া

MapTemplate

( অপ্রচলিত )

androidx.car.app.NAVIGATION_TEMPLATES নেভিগেশন

PlaceListNavigationTemplate

( অপ্রচলিত )

androidx.car.app.NAVIGATION_TEMPLATES নেভিগেশন

RoutePreviewNavigationTemplate

( অপ্রচলিত )

androidx.car.app.NAVIGATION_TEMPLATES নেভিগেশন

রেফারেন্স বাস্তবায়ন দেখুন

সম্পূর্ণ রেফারেন্স বাস্তবায়ন দেখতে, নেভিগেশন নমুনা দেখুন।

পৃষ্ঠের অনুমতি ঘোষণা করুন

আপনার অ্যাপ যে টেমপ্লেটটি ব্যবহার করছে তার জন্য প্রয়োজনীয় অনুমতির পাশাপাশি, সারফেসে অ্যাক্সেস পেতে আপনার অ্যাপকে অবশ্যই তার AndroidManifest.xml ফাইলে androidx.car.app.ACCESS_SURFACE অনুমতিটি ঘোষণা করতে হবে:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.ACCESS_SURFACE" />
  ...
</manifest>

পৃষ্ঠতলে প্রবেশ করুন

হোস্ট কর্তৃক প্রদত্ত Surface অ্যাক্সেস করার জন্য, আপনাকে অবশ্যই একটি SurfaceCallback ইমপ্লিমেন্ট করতে হবে এবং সেই ইমপ্লিমেন্টেশনটি AppManager car সার্ভিসে প্রদান করতে হবে। বর্তমান Surface onSurfaceAvailable() এবং onSurfaceDestroyed() কলব্যাকের SurfaceContainer প্যারামিটারে আপনার SurfaceCallback এ পাস করা হয়।

কোটলিন

carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)

জাভা

carContext.getCarService(AppManager.class).setSurfaceCallback(surfaceCallback);

কন্টেন্ট রেন্ডার করতে একটি ভার্চুয়াল ডিসপ্লে ব্যবহার করুন

Canvas এপিআই ব্যবহার করে সরাসরি Surface রেন্ডার করার পাশাপাশি, আপনি VirtualDisplay এবং Presentation এপিআই ব্যবহার করেও Surface ভিউ রেন্ডার করতে পারেন, যেমনটি এই উদাহরণে দেখানো হয়েছে:

class HelloWorldSurfaceCallback(context: Context) : SurfaceCallback {
  lateinit var virtualDisplay: VirtualDisplay
  lateinit var presentation: Presentation

  override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
      virtualDisplay = context
          .getSystemService(DisplayManager::class.java)
          .createVirtualDisplay(
              VIRTUAL_DISPLAY_NAME ,
              surfaceContainer.width,
              surfaceContainer.height,
              surfaceContainer.dpi,
              surfaceContainer.surface,
              0
          )

      presentation = Presentation(context, virtualDisplay.display)

      // Instantiate the view to be used as the content view
      val view = ...

      presentation.setContentView(view)
      presentation.show()
  }

  override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) {
    presentation.dismiss()
    // This handles releasing the Surface provided when creating the VirtualDisplay
    virtualDisplay.release()
  }
}

ভার্চুয়াল ডিসপ্লেতে রেন্ডার করতে কম্পোজ ব্যবহার করুন।

আপনি Presentation কন্টেন্ট ভিউ হিসেবে একটি ComposeView ব্যবহার করতে পারেন। যেহেতু ComposeView একটি অ্যাক্টিভিটির বাইরে ব্যবহৃত হয়, তাই নিশ্চিত করুন যে এটি বা এর কোনো প্যারেন্ট ভিউ একটি LifecycleOwner এবং SavedStateRegistryOwner প্রোপাগেট করে। এটি করার জন্য, setViewTreeLifecycleOwner এবং setViewTreeSavedStateRegistryOwner ব্যবহার করুন।

Session ইতিমধ্যেই LifecycleOwner প্রয়োগ করেছে। উভয় ভূমিকা পালন করার জন্য, আপনার ইমপ্লিমেন্টেশন অতিরিক্তভাবে SavedStateRegistryOwner প্রয়োগ করতে পারে।

class HelloWorldSession() : Session(), SavedStateRegistryOwner { ... }

class HelloWorldSurfaceCallback(session: HelloWorldSession) : SurfaceCallback {
  ...

  override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) {
    ...
    val view = ComposeView(session.carContext)
    view.setViewTreeLifecycleOwner(session)
    view.setViewTreeSavedStateRegistryOwner(session)
    view.setContent {
      // Composable content
    }

    presentation.setContentView(view)
    presentation.show()
  }

  ...
}

দৃশ্যমান পৃষ্ঠতল এলাকা বুঝুন

হোস্ট ম্যাপের উপরে টেমপ্লেটগুলোর জন্য ইউজার ইন্টারফেস এলিমেন্টগুলো আঁকতে পারে। সারফেসের যে অংশটি বাধামুক্ত এবং ব্যবহারকারীর কাছে দৃশ্যমান হওয়ার সম্ভাবনা সবচেয়ে বেশি, তা জানানোর জন্য হোস্ট SurfaceCallback.onVisibleAreaChanged মেথডটি কল করে।

পরিবর্তনের সংখ্যা সর্বনিম্ন রাখতে, হোস্ট ক্ষুদ্রতম আয়তক্ষেত্রটি দিয়ে SurfaceCallback.onStableAreaChanged মেথডটিকে কল করে, যেটি বর্তমান টেমপ্লেট অনুযায়ী সর্বদা দৃশ্যমান থাকে।

উদাহরণস্বরূপ, যখন কোনো নেভিগেশন অ্যাপ উপরে একটি অ্যাকশন স্ট্রিপ সহ NavigationTemplate ব্যবহার করে, তখন স্ক্রিনে আরও জায়গা তৈরি করার জন্য ব্যবহারকারী যখন স্ক্রিনের সাথে কোনো ইন্টারঅ্যাকশন করেন না, তখন অ্যাকশন স্ট্রিপটি লুকিয়ে ফেলা যেতে পারে। এই ক্ষেত্রে, onStableAreaChanged এবং onVisibleAreaChanged এ একই আয়তক্ষেত্র সহ একটি কলব্যাক হয়।

যখন অ্যাকশন স্ট্রিপটি লুকানো থাকে, তখন শুধুমাত্র বৃহত্তর এলাকাটির জন্য onVisibleAreaChanged কল করা হয়। যদি ব্যবহারকারী স্ক্রিনে ইন্টারঅ্যাক্ট করেন, তবে শুধুমাত্র প্রথম আয়তক্ষেত্রটির জন্য onVisibleAreaChanged কল করা হয়।

ডার্ক থিম সমর্থন করে

গাড়ির জন্য অ্যান্ড্রয়েড অ্যাপের গুণমান- এ বর্ণিত নিয়ম অনুযায়ী, যখন হোস্ট মনে করে যে পরিস্থিতি তা দাবি করে, তখন অ্যাপগুলিকে অবশ্যই Surface ইনস্ট্যান্সের উপর যথাযথ গাঢ় রঙ ব্যবহার করে তাদের মানচিত্র পুনরায় আঁকতে হবে।

ডার্ক ম্যাপ আঁকতে, CarContext.isDarkMode মেথডটি ব্যবহার করুন। ডার্ক থিমের অবস্থা পরিবর্তিত হলে, Session.onCarConfigurationChanged কলটি পাওয়া যায়।

ক্লাস্টার ডিসপ্লেতে মানচিত্র আঁকুন

মূল ডিসপ্লেতে ম্যাপ আঁকার পাশাপাশি, নেভিগেশন অ্যাপগুলো স্টিয়ারিং হুইলের পেছনের ক্লাস্টার ডিসপ্লেতেও ম্যাপ আঁকা সমর্থন করে। আরও জানতে, ‘ক্লাস্টার ডিসপ্লেতে অঙ্কন’ দেখুন।