Harita çizin

Aşağıdaki şablonları kullanan gezinme, önemli yer (POI) ve hava durumu uygulamaları, Surface erişerek harita çizebilir.

Aşağıdaki şablonları kullanmak için uygulamanızın AndroidManifest.xml dosyasındaki bir <uses-permission> öğesinde bu izinlerden birini beyan etmesi gerekir.

Şablon İzin Rehberlik
NavigationTemplate androidx.car.app.NAVIGATION_TEMPLATES Gezinme
MapWithContentTemplate

androidx.car.app.NAVIGATION_TEMPLATES

veya

androidx.car.app.MAP_TEMPLATES

Gezinme, ÖY, Hava durumu

MapTemplate

(kullanımdan kaldırıldı)

androidx.car.app.NAVIGATION_TEMPLATES Gezinme

PlaceListNavigationTemplate

(kullanımdan kaldırıldı)

androidx.car.app.NAVIGATION_TEMPLATES Gezinme

RoutePreviewNavigationTemplate

(kullanımdan kaldırıldı)

androidx.car.app.NAVIGATION_TEMPLATES Gezinme

Referans uygulamayı inceleyin

Tam bir referans uygulamasını görüntülemek için Navigation Sample'a bakın.

Yüzey iznini beyan etme

Uygulamanızın kullandığı şablon için gereken izne ek olarak, yüzeye erişmek için uygulamanızın androidx.car.app.ACCESS_SURFACE iznini AndroidManifest.xml dosyasında beyan etmesi gerekir:

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

Platforma erişim

Barındırıcının sağladığı Surface hizmetine erişmek için SurfaceCallback uygulamanız ve bu uygulamayı AppManager araç hizmetine sağlamanız gerekir. Geçerli Surface, onSurfaceAvailable() ve onSurfaceDestroyed() geri çağırmalarının SurfaceContainer parametresinde SurfaceCallback öğenize iletilir.

Kotlin

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

Java

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

İçeriği oluşturmak için sanal ekran kullanma

Canvas API'yi kullanarak doğrudan Surface içine oluşturmanın yanı sıra, bu örnekte gösterildiği gibi VirtualDisplay ve Presentation API'lerini kullanarak da Görünümleri Surface içine oluşturabilirsiniz:

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

Sanal ekranda oluşturmak için Oluştur'u kullanma

ComposeView, Presentation içeriği görünümü olarak kullanabilirsiniz. Çünkü ComposeView etkinlik dışında kullanılıyor. Bu nedenle, ComposeView veya üst görünümün LifecycleOwner ve SavedStateRegistryOwner'yi yaydığını doğrulayın. Bunun için setViewTreeLifecycleOwner ve setViewTreeSavedStateRegistryOwner özelliğini kullanın.

Session zaten LifecycleOwner'yi uyguluyor. Her iki rolü de sunmak için uygulamanız ek olarak SavedStateRegistryOwner'yı da uygulayabilir.

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

  ...
}

Görünür yüzey alanını anlama

Düzenleyen, şablonlar için kullanıcı arayüzü öğelerini haritanın üzerine çizebilir. Ana makine, yüzeyin engellenmemiş ve kullanıcı tarafından görünür olma olasılığı en yüksek olan alanını bildirmek için SurfaceCallback.onVisibleAreaChanged yöntemini çağırır.

Değişiklik sayısını en aza indirmek için ana makine, her zaman mevcut şablona göre görünür olan en küçük dikdörtgenle SurfaceCallback.onStableAreaChanged yöntemini çağırır.

Örneğin, bir gezinme uygulaması ekranın üst kısmında NavigationTemplate ile birlikte işlem şeridi kullandığında, ekranda daha fazla alan oluşturmak için kullanıcı ekranla etkileşimde bulunmadığında işlem şeridi gizlenebilir. Bu durumda, aynı dikdörtgenle onStableAreaChanged ve onVisibleAreaChanged geri aranır.

İşlem şeridi gizlendiğinde, yalnızca onVisibleAreaChanged daha büyük alanla birlikte çağrılır. Kullanıcı ekranla etkileşimde bulunursa ilk dikdörtgenle yalnızca onVisibleAreaChanged çağrılır.

Koyu tema desteği

Uygulamalar, Surface örneğine haritalarını, ana makine koşulların bunu gerektirdiğini belirlediğinde Android app quality for cars (Arabalar için Android uygulama kalitesi) bölümünde açıklandığı gibi uygun koyu renklerle yeniden çizmelidir.

Koyu renkli bir harita çizmek için CarContext.isDarkMode yöntemini kullanın. Koyu tema durumu değiştiğinde Session.onCarConfigurationChanged numarasına bir arama alırsınız.

Küme ekranında harita çizme

Navigasyon uygulamaları, ana ekranda harita çizmenin yanı sıra direksiyonun arkasındaki gösterge ekranında da harita çizebilir. Daha fazla bilgi için Küme ekranına çizim yapma başlıklı makaleyi inceleyin.