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 |
veya
|
Gezinme, ÖY, 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 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.