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 |
veya
|
Gezinme, Öİ, Hava durumu |
|
(kullanımdan kaldırıldı) |
androidx.car.app.NAVIGATION_TEMPLATES |
Gezinme |
|
(kullanımdan kaldırıldı) |
androidx.car.app.NAVIGATION_TEMPLATES |
Gezinme |
(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.