Harita çizin

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

Aşağıdaki şablonları kullanmak için uygulamanızın AndroidManifest.xml dosyasındaki <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, Öİ, 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 uygulamayı görüntülemek için Navigation Sample'a (Gezinme Örneği) 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ç servisine 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 kullanılabilir. Çünkü ComposeView bir etkinlik dışında kullanılıyor. Bu nedenle, LifecycleOwner veya üst görünümün LifecycleOwner ve SavedStateRegistryOwner değerlerini 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 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()
  }

  ...
}

Yüzeyin görünür 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, SurfaceCallback.onStableAreaChanged yöntemini en küçük dikdörtgenle çağırır. Bu dikdörtgen, mevcut şablona göre her zaman görünür.

Örneğin, bir gezinme uygulaması ekranın üst kısmında işlem şeridi ile birlikte NavigationTemplate 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, daha büyük alanla yalnızca onVisibleAreaChanged ç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, ana makine koşulların bunu gerektirdiğini belirlediğinde haritalarını Android app quality for cars (Arabalar için Android uygulama kalitesi) bölümünde açıklandığı gibi uygun koyu renklerle Surface örneğine 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.