วาดแผนที่

แอปการนำทาง จุดที่น่าสนใจ (POI) และสภาพอากาศที่ใช้เทมเพลตต่อไปนี้ จะวาดแผนที่ได้โดยเข้าถึง Surface

หากต้องการใช้เทมเพลตต่อไปนี้ แอปของคุณต้องประกาศสิทธิ์ที่เกี่ยวข้องอย่างใดอย่างหนึ่งในองค์ประกอบ <uses-permission> ในไฟล์ AndroidManifest.xml

เทมเพลต สิทธิ์ คำแนะนำ
NavigationTemplate androidx.car.app.NAVIGATION_TEMPLATES การนำทาง
MapWithContentTemplate

androidx.car.app.NAVIGATION_TEMPLATES

หรือ

androidx.car.app.MAP_TEMPLATES

การนำทาง POI สภาพอากาศ

MapTemplate

(เลิกใช้งานแล้ว)

androidx.car.app.NAVIGATION_TEMPLATES การนำทาง

PlaceListNavigationTemplate

(เลิกใช้งานแล้ว)

androidx.car.app.NAVIGATION_TEMPLATES การนำทาง

RoutePreviewNavigationTemplate

(เลิกใช้งานแล้ว)

androidx.car.app.NAVIGATION_TEMPLATES การนำทาง

ดูการติดตั้งใช้งานอ้างอิง

ดูการติดตั้งใช้งานอ้างอิงที่สมบูรณ์ได้ที่ตัวอย่างการนำทาง

ประกาศสิทธิ์ของ Surface

นอกเหนือจากสิทธิ์ที่จำเป็นสำหรับเทมเพลตที่แอปของคุณใช้แล้ว แอปของคุณต้องประกาศสิทธิ์ androidx.car.app.ACCESS_SURFACE ในไฟล์ AndroidManifest.xml เพื่อรับสิทธิ์เข้าถึงพื้นผิว

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

เข้าถึงพื้นผิว

หากต้องการเข้าถึง Surface ที่โฮสต์ระบุ คุณต้องใช้ SurfaceCallback และให้การใช้งานดังกล่าวแก่บริการรถยนต์ของ AppManager ระบบจะส่ง Surface ปัจจุบันไปยัง SurfaceCallback ในพารามิเตอร์ SurfaceContainer ของ onSurfaceAvailable() และ การเรียกกลับ onSurfaceDestroyed()

Kotlin

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

Java

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

ใช้จอแสดงผลเสมือนเพื่อแสดงเนื้อหา

นอกจากการแสดงผลโดยตรงใน Surface โดยใช้ Canvas API แล้ว คุณยังแสดงผล View ใน Surface โดยใช้ VirtualDisplay และ Presentation API ได้ด้วย ดังตัวอย่างนี้

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()
  }
}

ใช้ Compose เพื่อแสดงผลไปยังจอแสดงผลเสมือน

คุณสามารถใช้ ComposeView เป็นมุมมองเนื้อหาของ Presentation เนื่องจากมีการใช้ ComposeViewนอกกิจกรรม ให้ยืนยันว่ากิจกรรมหรือมุมมองระดับบน ส่งต่อ LifecycleOwner และ SavedStateRegistryOwner โดยใช้ setViewTreeLifecycleOwner และ setViewTreeSavedStateRegistryOwner

Session ใช้ LifecycleOwner อยู่แล้ว หากต้องการทำหน้าที่ทั้ง 2 บทบาท การติดตั้งใช้งานของคุณจะสามารถติดตั้งใช้งาน 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 โดยใช้สีเข้มที่เหมาะสม เมื่อโฮสต์พิจารณาว่ามีเงื่อนไขที่รับประกันได้ ตามที่อธิบายไว้ในคุณภาพแอป Android สำหรับรถยนต์

หากต้องการวาดแผนที่สีเข้ม ให้ใช้วิธี CarContext.isDarkMode เมื่อสถานะของดาร์ก โหมดมีการเปลี่ยนแปลง คุณจะได้รับสายไปยัง Session.onCarConfigurationChanged

วาดแผนที่บนจอแสดงผลคลัสเตอร์

นอกจากจะวาดแผนที่บนจอแสดงผลหลักแล้ว แอปการนำทางยัง รองรับการวาดแผนที่บนจอแสดงผลแผงหน้าปัดด้านหลังพวงมาลัยด้วย ดูข้อมูลเพิ่มเติมได้ที่การวาดภาพไปยังจอแสดงผลคลัสเตอร์