Android XR ile ekran alanının ötesine geçin ve uygulamalarınızı gerçek dünyaya sabitleyin. Bu oturumda, Jetpack Compose Glimmer ve ARCore'un Geospatial API'sini kullanarak coğrafi konuma duyarlı Android XR deneyimleri oluşturmayı öğreneceksiniz. Öncelikle ARCore ile bir cihazın coğrafi konumunu nasıl alacağınızı ele alacağız. Ardından, Glimmer'ın minimal kullanıcı arayüzü bileşenlerinin Görsel Konumlandırma Sistemi (VPS) aracılığıyla gerçek dünyadaki konumlara nasıl sabitlenebileceğini göreceksiniz. Basit ve konuma duyarlı bir mekansal deneyim oluşturmak için bunları birleştireceğiz.
Transkript
Herkese merhaba. Android Developer Summit'teki Android XR oturumlarının ilkine hoş geldiniz.
Evet.
Birçoğunuzun Android XR hakkında bilgi edinmesi bizi çok heyecanlandırıyor.
Ben Yasmine Quintana Evjen. Paul Hoover ve Dereck Bridie de bizimle birlikte. Sohbet ilerledikçe onlar da bize katılacak.
Bu oturumda Android XR'ı ve Jetpack Compose Glimmer ile Jetpack XR için ARCore'u kullanarak gerçek dünyada konuma sabitlenmiş deneyimler oluşturmayı ele alacağız.
Ancak önce Android XR'a kısaca değinelim.
Android XR, kullanıcıların uygulamanızla etkileşim kurma şeklini yeniden tanımlayan, ekranın ötesine geçip çevrelerindeki alana taşıyan yeni bir platformdur.
Platformu, dijital deneyimleri doğrudan fiziksel ortama taşıyacak şekilde tasarlıyoruz.
Bu, gerçek dünyadaki varlığı geliştiren, göz atılabilir yer paylaşımları veya sonsuz bir sürükleyici ortam anlamına gelebilir.
Yıllardır birlikte geliştirdiğimiz açık Android ekosistemi, artık oda büyüklüğünde ve hayal gücünüzün sınırlarını zorlayacak kadar geniş bir tuval sunuyor.
XR'ı, ses ve görüntülü gözlüklerde hafif, artırılmış deneyimler sunan akıllı gözlüklerden odaklanma, üretkenlik ve sürükleyici eğlence özellikleri sunan sürükleyici başlıklar ile kablolu XR gözlüklerine kadar uzanan bir cihaz yelpazesi olarak görüyoruz.
Android XR ailesinin en yeni üyesi olan XREAL AURA'yı hemen satın alabilirsiniz.
Bu cihaz, hafif ve güçlü yapısıyla Android'in tanıdık özellikleriyle XR deneyimleri sunar.
Platformla ilgili vizyonumuz, Android için geliştirme yapıyorsanız XR için de geliştirme yapmaya hazır olduğunuzdur.
Aşina olduğunuz uygulama modelini, kitaplığı ve araçları kullanarak Android XR'da uygulama geliştirmenizi kolaylaştırmak istiyoruz.
Mevcut 2D Android uyumlu uygulamanız, çok az değişiklikle veya hiç değişiklik yapılmadan Android XR kulaklıklarında ve kablolu XR gözlüklerinde çalışır.
Ayrıca, kullanıcıların kendilerini evlerinde hissetmelerini sağlayacak muhteşem XR deneyimleri oluşturmak için XR platformuna özel olarak tasarlanmış bir dizi kitaplık sunuyoruz.
Diğer etkileyici platformlarda deneyimler oluşturmaya alışkın olan geliştiriciler, OpenXR ve Unity, Godot ve Unreal gibi 3D motor desteğimizle içerik oluşturabilir.
Android kitaplıklarıyla derleme yapmaktan bahsedelim.
Uygulamalarınızı sürükleyici ve artırılmış deneyimler genelinde XR'a genişletmenize yardımcı olan bir Kotlin kitaplıkları seti olan Jetpack XR SDK'yı sunuyoruz.
Şimdi de sürükleyici kitaplıklarımıza göz atalım.
Jetpack XR kitaplıklarımız bu yıl beta ve kararlı sürüme ulaştı. Böylece, sürükleyici XR deneyimlerinizi oluşturmaya başlamak için ihtiyacınız olan güveni elde edebilirsiniz.
Algılama katmanı, Jetpack XR için ARCore'dur.
Bu kitaplık, gerçek dünya hakkında bilgi sağlar. Örneğin, masa gibi düz yüzeylerin nerede olduğu ve kullanıcıların ellerinin nasıl konumlandırıldığı gibi.
3D uzaydaki noktaları takip edebilir ve gerekli izinler verildiğinde bu bilgileri uygulamalara iletebilir.
Jetpack XR SceneCore ise uzamsal içeriğinizi yerleştirmek için bir sahne grafiği sağlar.
Bu kitaplık, varlıkları 3D uzayda sunabilir ve hassas sahne grafiği yerleşimi için uzamsal davranışlar sağlar.
XR için Jetpack Compose, özellikle 3D için tasarlanmış yeni alt uzay composable'ları sunar.
Satır ve sütunlarla oluşturma gibi Compose düzenlerine aşina olan Android geliştiriciler, uzamsal kullanıcı arayüzü düzenlerini sezgisel olarak kullanabilir.
Üç boyutlu satır oluşturarak birden fazla üç boyutlu paneli, konumlarını veya boyutlarını manuel olarak hesaplamanıza gerek kalmadan yan yana yerleştirebilirsiniz.
Uzamsal panel veya orbiter gibi alt alan oluşturulabilirlerini kullanarak 2D bileşenlerinizi bu yeni 3D alana kolayca genişletebilirsiniz.
Elbette alt uzay bileşenleri, 2D içerik göstermekten daha fazlasını yapabilir.
XR için Compose, üç boyutlu harici yüzey ve üç boyutlu glTF modeli aracılığıyla üç boyutlu videoların yanı sıra 3D modelleri de destekler.
Şimdi de artırılmış uygulamalardan bahsedelim.
Jetpack Projected kitaplığıyla, mevcut mobil uygulamanızı sensörler ve ekran gibi akıllı gözlük donanımlarından yararlanacak şekilde geliştirebilirsiniz.
Son olarak, gözlükler için optimize edilmiş Android XR deneyimleri oluşturmaya yönelik bir kullanıcı arayüzü araç seti olan Jetpack Compose Glimmer'ı kullanabilirsiniz.
Jetpack Compose Glimmer, XR deneyimlerinizi oluşturmak için kullanabileceğiniz stiller ve hazır bileşenler içerir.
Geçen yıl kullanıma sunduğumuz Glimmer'ın özelliklerini genişletmeye devam ediyoruz. Bu kapsamda, Glimmer ile görüntü arabirimli gözlük uygulamalarınızı oluşturmanıza yardımcı olacak bir temsilci becerisi de ekledik.
android skills add display-glasses-with-jetpack-compose-glimmerÖzellik kullanıma sunulduğundan beri geri bildirimlerinizi dikkate alıyoruz.
Jetpack Compose Glimmer'ı akıllı gözlüklerin ötesine taşımamızı istediğinizi duyduk.
Glimmer ile mekansal olarak sabitlenmiş deneyimlerinizi daha iyi desteklemek için değişiklikler yaptığımızı duyurmaktan mutluluk duyuyoruz. Bu konuya konuşmanın ilerleyen bölümlerinde daha ayrıntılı olarak değineceğiz.
Glimmer'ı optimize etme çalışmalarımız, ekrandan kablolu XR gözlüklere kadar çeşitli XR form faktörlerinde görüntülenecek yeni bir yüzey oluşturarak başladı.
Bu yeni yüzeyin eklenmesi, kullanıcı arayüzünüzü özelleştirme konusunda daha fazla esneklik sağlar.
Uygulamanızın markasını daha belirgin hale getirmek için Glimmer bileşenlerine özel renkler ekledik.
XR uygulamalarınızda marka stilinizi yansıtmak için bunları kullanın.
Jetpack Compose Glimmer kitaplığımız, hedeflediğiniz renkleri ve marka renklerinizi gözlükte kullanıma uygun renklere dönüştüren yardımcı işlevler sunar.
Bunun amacı, optik şeffaf ekranlarda görünürlüğü optimize etmektir.
Şimdi bunu uygulamalı olarak görelim.
Bu gözlük uygulamasında odaklanılan düğmenin rengini değiştirmek istiyoruz. Bunun için en sevdiğim renklerden birini seçeceğim.
val brandColor = Color(0xFFFFAABB)
val focusedColor = ButtonDefaults.focusedColor(brandColor)
Column(…) {
LeadingImageCard(
focusable = false,
…
) {
…
}
ButtonGroup(...) {
Button(
onClick = {},
leadingIcon = { … },
focusedColor = focusedColor,
) { Text("Add to cart") }
/* Rest of the buttons */
}
}Renk koda eklendiğinde Glimmer yardımcı işlevleri, rengi gözlükle görülebilecek bir renge ayarlayarak görünürlüğü optimize eder.
Tüm bunlar Jetpack Compose Glimmer kitaplığımızda yerleşik olarak bulunur. Böylece çeşitli ortamlarda harika görünen deneyimler oluşturabilirsiniz.
Android Studio'da emülatörü kullanarak gözlük kullanıcı arayüzünüzün açık, koyu veya yoğun ortamlar gibi çeşitli arka planlarda nasıl görüneceğini görselleştirebilirsiniz.
Bu güncellemeler daha başlangıç.
Tamam, hayır.
Ekibim bu şakaya gülmeyeceğinizi söyledi ama yine de şakayı kaldırmadım.
Şimdi sözü Paul'a bırakıyorum. Jetpack Compose Glimmer hakkında daha fazla bilgi verecek.
Test ediyoruz.
Sonraki düğmesine basmam gerekiyor.
Teşekkürler, Yasemin.
İşte böyle.
Yasmine'in de belirttiği gibi Jetpack Compose Glimmer, görüntü arabirimli gözlükler için özel olarak tasarlanmış uygulamalar geliştirmek için temel yapı taşlarını sağlar.
Bileşenlerimiz, optik şeffaf ekranlar için geliştirilen en iyi uygulamaları entegre eder. Bu bileşenleri doğrudan API'lere entegre ederek tüm geliştiricilerin güzel ve işlevsel optik şeffaf deneyimler oluşturmasını sağlıyoruz.
Bunun gibi optik şeffaf cihazlar için uygulama tasarlayıp geliştirirken dikkat etmeniz gereken birkaç nokta vardır.
İlk olarak, şeffaf bir ekran olduğu için siyah renk yoktur.
Dünya görünür olduğunda siyah şeffaf olur.
Bu nedenle, kullanıcı arayüzünüz, metniniz ve içeriğiniz için kontrastı korumak amacıyla koyu arka planlara güvenemezsiniz.
Siyah görünmez olsa da diğer dijital içerikleri gizlemek için kullanabilirsiniz.
Glimmer kullanıcı arayüzü çerçevesinde, kullanıcı arayüzü öğelerini birbirinden kolayca ayırmanızı ve hiyerarşi hissi vermenizi sağlayan bir derinlik API'si bulunur.
Burada, bu yığındaki kartların derinlik sayesinde birbirinden nasıl ayrıldığını görebilirsiniz.
Görüş bilimcilerimiz, çoğu ışıklandırma koşulunda görülebilen metin ve simgeler için hedef kontrast oranları belirledi.
Yasmine'in gösterdiği gibi, bunu çerçeveye ekleyebiliriz veya ekledik. Böylece yüzey renklerini özelleştirdiğinizde arayüzünüzün kullanıcılarınız için okunabilir olacağından emin olabilirsiniz.
Bu ve diğer en iyi uygulamaları, genişleyen bileşen kitaplığımıza ekledik.
Son zamanlarda birçok yeni bileşen kullanıma sunduk.
En yeni bileşenlerimizden biri, zarif hareket geçişleri ve hareketleri içeren sayfa gezgini bileşenidir.
val pagerState =
rememberGlimmerPagerState(pageCount = { 10 })
GlimmerHorizontalPager(pagerState) { page ->
/* Card Content */
}Compose'un yatay sayfa gezginini biliyorsanız bu bileşen size çok tanıdık gelecektir.
Ayrıca sayfa gezginleri, yığınlar ve diğer Glimmer kullanıcı arayüzü öğeleriyle sorunsuz entegrasyon için tasarlanmış dört yeni kart varyantı ekledik.
Baştaki resim kartları ve sondaki resim kartları, metin ve resimleri yan yana gösterir.
Bu nedenle, eşit miktarda metin ve görsel bilgiye sahip olduğunuzda bu kart varyantlarını kullanın.
Resim kartını kendi kart varyantına ayırdık.
Bu düzen, bu video seçicide olduğu gibi tek bir satır metin veya başlık içeren büyük bir resminiz olduğunda en iyi sonucu verir.
İşlem kartı varyantı, karta tek bir düğme yerleştirir.
Bu seçeneği, kullanıcıların kartı etkinleştirdiklerinde tam olarak ne olacağını bilmelerini istediğinizde (ör. bu hedef seçicide) kullanın.
Düğme grupları, küçük bir alana çok sayıda düğme sığdırmanıza olanak tanır.
ButtonGroup {
Button(onClick = {}) { Text("Button 1") }
Button(onClick = {}) { Text("Button 2") }
Button(onClick = {}) { Text("Button 3") }
Button(onClick = {}) { Text("Button 4") }
Button(onClick = {}) { Text("Button 5") }
}Buradaki basit kodla bu güzel geçişleri, kaydırma davranışlarını, kenarları gizleyen ve yalnızca gerektiğinde gösterilen örtüleri ve gözlükten denetleyiciye otomatik olarak yönlendirilen girişleri elde edersiniz.
Düğme grupları, yeni simge düğmelerimizi ve açma/kapatma düğmelerimizi de içerebilir.
var buttonChecked by remember { mutableStateOf(false) }
ToggleButton(
checked = buttonChecked,
leadingIcon = { Icon(FavoriteIcon) },
onCheckedChange = { buttonChecked = it }
) {
Text(if (buttonChecked) "On" else "Off")
}Bu medya kontrolünü oluşturmak için kullanılan tüm düğme türlerimizi burada görebilirsiniz.
Artık kullanıcı arayüzünüzü farklı arka planlarda test etmek de çok kolay.
Gözlük emülatörü, 360° fotoğraflar eklemenize ve farklı arka planlarda, yoğun arka planlarda ve açık, koyu renklerde test edebilmeniz için kaydırmanıza olanak tanır.
Düğme grupları, bağlamsal işlemleri göstermek için bu gibi ayrıntı görünümlerinde kullanılabilir.
Dokunulduğunda, paylaşılan öğe geçişlerini kullanarak ayrıntılı bir görüntüleyici durumuna gidebilir, ardından sistemin geri hareketini kullanarak önceki görünüme dönebilirsiniz.
Çok güzel.
Ayrıca ses girişi göstergesi ve uyarı iletişim kutuları ekledik.
Yani evet, birçok yeni şey var.
Yeni özelliklerden bazılarını gördüğümüze göre artık bir şeyler oluşturmaya başlayabiliriz.
Glimmer'ı akıllı gözlükler oluşturmak için kullanmanın yanı sıra kablolu XR gözlükleri için deneyimler oluşturmak amacıyla da kullanabiliriz.
Gerçek dünyadaki konuma dayalı sabit noktalarla başlayarak çevrenizdeki dünyayı zenginleştiren deneyimler oluşturmanızı istiyoruz.
Yeni bir şehirde olduğunuzu, örneğin bir geliştirici konferansı için seyahat ettiğinizi ve şehirde yemek yiyecek bir yer aradığınızı düşünün.
En sevdiğiniz navigasyon uygulamasından yakındaki restoranları ve puanlarını bulmasını isteyebilirsiniz.
Bilgiler doğrudan konumun üzerine yerleştirilerek bağlam, bilgi ve rehberlik sağlanabilir.
Burada, Simge İşaretleyici adlı en yeni Glimmer bileşenimizi görebilirsiniz.
Bu sayede, fiziksel dünyadaki önemli unsurları vurgulayabilir ve bunları bu kart gibi diğer Glimmer bileşenleriyle eşleştirebilirsiniz.
Bu örnekte, Google Haritalar, Places ve Geospatial API'leri kullanarak önemli yerlere açıklama ekleniyor.
Dereck, hadi bunu nasıl ayarlayacaklarını gösterelim.
Hadi yapalım.
İşte böyle.
İşte böyle.
Paul'un da dediği gibi, hadi başlayalım.
Bu nedenle, developer.android.com/xr adresindeki geliştirici belgelerini kullanacağız ve Jetpack Compose Glimmer bileşen kitaplığına göz atacağız.
Böylece Glimmer'da bulunan tüm bileşenlerin görsel bir özetini görebilirsiniz.
Paul'un daha önce gösterdiği kullanıcı arayüzüyle başlayalım.
Bu nedenle, uzamsal gösterge ve bilgi kutusu oluşturmak için Glimmer kullanıcı arayüzünü kullanacağız.
Kullanacağımız bileşenleri belirleyerek başlayalım.
Solda bir simge işaretçi, sağda ise yeri açıklayan bir kart kullanacağız.
Android Studio'ya giderseniz bu bölmeyi diğer tüm Compose bileşenleri gibi önizleyebilir ve değişikliklerinizi anında görebilirsiniz.
Daha önce de belirttiğimiz gibi, kullanıcı arayüzünü tüm farklı arka plan ortamlarında önizleyebilir ve kullanıcı arayüzünüzün kontrastının karanlık ve aydınlık ortamlar gibi birden fazla senaryo türünde yeterli olduğundan emin olabilirsiniz.
Tuval ayarlandıktan sonra bir satır oluşturup içine biraz boşluk bırakarak bir simge işaretçi ve örnek metin içeren bir kart yerleştireceğiz.
İşte bu kadar.
2D önizlemeden memnunsanız gerçek dünyada bir şeyleri işaretlemeye başlayabiliriz. Bunu yapmak için kullanıcı arayüzünü uzamsallaştıracağız.
Yani 2D yerine 3D olarak düzenleyeceğiz.
Bu nedenle, uzamsal kullanıcı arayüzleri, kullanıcının önündeki bir 3D alan olan alt alanlarda bulunur.
Subspace {
SpatialPanel {
VideoPlayer()
}
}Varsayılan olarak, bir alt alan aslında içeriğini kullanıcıdan rahat bir mesafeye yerleştirir.
Geospatial API'yi nasıl kullanacağınızı göstermeden önce yakındaki bir yere bir nesne yerleştirelim.
Daha önce bahsettiğim alt uzay composable'ında, takip hedefini belirtmenize olanak tanıyan isteğe bağlı bir parametre vardır.
val state by
qrCode.state.collectAsState()
Subspace(FollowTarget.anchor(anchor)) {
SpatialPanel {
Row {
IndicatorDot()
Spacer()
QrCodeCard(state)
}
}
}Gerçek dünyaya bir şey eklemek için önce Jetpack XR için ARCore'dan elde edilen bir sabitleyici oluşturmanız gerekir.
Bu örnekte QR kodu tanıma özelliğini kullanıyorum.
Bu sayede QR kodlarını okuyup takip edebileceksiniz. Böylece içeriğiniz bu QR kodunu uzayda takip edebilecek ve daha önce gördüğümüz kullanıcı arayüzünü ekleyeceğiz.
Anladım.
Dijital içeriği yakınınızdaki gerçek dünyaya nasıl yerleştireceğinizi gösterdim.
Paul'un örneğine geri dönelim.
Ben Hollandalıyım.
Mountain View'u pek iyi bilmiyorum.
Bu etkinlikten sonra, eğlenceli kahve mekanları bulmanıza yardımcı olacak bir uygulama oluşturmanıza yardımcı olmak istiyorum.
Artık Jetpack XR için ARCore'da bulunan Geospatial API ile kullanıcılarımızın bu yerleri bulmasına nasıl yardımcı olabileceğimizi görelim.
İlk olarak akıllı telefonlarda kullanıma sunulan Geospatial API artık Android XR'da da kullanılabilir.
Cihazı desteklenen alanlarda konumlandırmak için Google Street View'dan alınan verileri GPS ölçümleriyle birleştirir.
Bu nedenle, akıllı gözlüklerde Geospatial API, kullanıcının konumunu ve yönünü doğru bir şekilde belirlemek için kullanılabilir ve yüksek hassasiyetli adım adım rota kullanım alanları sağlar.
Geospatial API, kablolu XR gözlükler gibi etkileyici cihazlarda gerçek dünyada doğru şekilde konumlandırılmış deneyimler oluşturmanıza olanak tanır.
Örneğin, binalara mekansal içerik ekleyebilir veya özel şehir turları oluşturabilirsiniz.
Şimdi bu üç adımı uygulayarak Geospatial API'yi kullanmaya başlayalım.
İlk olarak bir Google Cloud Platform projesi oluşturacak ve uygulamanızda kimlik doğrulamasını yapılandıracaksınız.
Ardından, uygulamanızda Geospatial API yapılandırılıp etkinleştirildiğinde kullanıcıdan konumunu tam ayrıntılı olarak alma izni istenir.
Ardından, oturumu Geospatial API'yi kullanacak şekilde yapılandırdıktan sonra hazırsınız.
Geospatial API ile ilgili geliştirici belgelerimizdeki tüm ayrıntıları, yenilenen Android XR geliştirici sayfamızda bulabilirsiniz.
Kullanıcının konumunu kullanarak Google Haritalar Platformu'ndaki Places API'den kullanıcının yakınındaki iyi kafeleri bulmasını isteyelim.
Öncelikle, kullanıcı nerede?
Geospatial API'den kullanıcının konumuyla ilgili sürekli güncellemeler almasını isteyeceğiz.
produceState<AppStatus>(Initializing) {
val geospatial = Geospatial.getInstance(session)
val wait = geospatial.state.onEach {
value = WaitingForGeospatial(it.geospatialTrackingState)
}.first {
it.geospatialTrackingState == Geospatial.GeospatialTrackingState.RUNNING
}
val accuracyWait = geospatial.state.onEach {
value = WaitingForGeospatialAccuracy(it)
}.first { it.horizontalAccuracy < horizontalAccuracyRequirement }
value = WaitingForPlacesResults
val result = client.findNearby(context, accWait.geospatialPose)
value = Done(result)
}Bu nedenle, coğrafi nesneye XR oturumu üzerinden erişeceğiz.
Ardından, Geospatial'ın gerekli merkez sensörlerini başlatıp Cloud API'ye bağlanarak çalışmaya başlamasını bekleyeceğiz.
Ardından, belirli bir doğruluk düzeyine ulaşılmasını bekleriz.
Bu nedenle, GPS ölçümleri alındığında veya görsel konumlandırma sistemi kullanıcının konumunda eşleşmeler bulduğunda doğruluk seviyeleri artabilir.
Yüksek doğruluk düzeyini beklemek, konuma dayalı deneyimlerin doğru yerde sabitlenmesini ve sonuçların kullanıcının yakın çevresinden alınmasını sağlamak açısından önemlidir.
Ardından, Geospatial API'den alınan konum değerlerini kullanarak Places API ile arama yapmaya hazır oluruz.
val bounds = CircularBounds.newInstance(
LatLng(pose.latitude, pose.longitude),
100.0, // radius, in meters
)
val placeFields = listOf(
Place.Field.ID, Place.Field.DISPLAY_NAME,
Place.Field.RATING, Place.Field.LOCATION,
)
return placesClient.searchNearby(
SearchNearbyRequest.builder(bounds, placeFields)
.setIncludedTypes(listOf(PlaceTypes.CAFE))
.setMaxResultCount(10)
.build()
).await()Bu nedenle, kullanıcının daha önce elde ettiğimiz konumunun etrafındaki yerleri sorgulamak için Places API ile bir SearchNearbyRequest kullanacağız ve 100 m içindeki sonuçları bulacağız.
Yerin kimliğini, görünen adını, puanını ve tabii ki konumunu alırız.
Son olarak, yer türü filtresi de dahil olmak üzere belirtilen parametrelerle arama yaparız.
Verilerle ilgili anlatacaklarımız bu kadar. Şimdi kullanıcı arayüzüne dönelim.
Bu nedenle, daha önce oluşturduğumuz işaretçiyi ve bilgi kutusunu nasıl yerleştireceğimizi bulmamız gerekiyor. Bunun için coğrafi sabitleyicileri kullanacağız.
Koda geri dönelim. XR oturumumuzu kullanarak Geospatial API'ye erişeceğiz. Ardından, daha önce arama sonuçlarından elde edilen belirli bir enlem ve boylamı kullanarak coğrafi yer işareti oluşturacağız.
val anchorResult by produceState<AnchorResult?>(null) {
val geospatial = Geospatial.getInstance(session)
value = geospatial.createAnchorOnSurface(
place.location.latitude, place.location.longitude,
surface = GeospatialSurface.TERRAIN,
altitudeAboveSurface = 3.0,
eastUpSouthQuaternion = Quaternion()
)
}Bu örnekte, rakımı bu koordinatlardaki arazinin 3 m üzerinde olacak şekilde belirttik. Ancak desteklenen çatı katlarına da ekleyebilirsiniz. Bu durumda rakım değeri, ilgili konumdaki binanın çatı katına göre belirlenir.
Yani, sabitleyiciyi döndürmek için sabitleyicinin dönüş değerlerini belirten bir kuaterniyon da kullanabilirsiniz.
Ancak bu örnekte, kullanıcı arayüzünü kullanıcıya bakacak şekilde döndüreceğimiz için varsayılan değerleri kullanacağız.
Ardından, daha önce oluşturduğumuz Glimmer kullanıcı arayüzünü bu sabitleyiciye ekleyeceğiz. Bu sayede, uzamsal olarak sabitlenmiş bir deneyim için gerekli yapı taşlarını elde etmiş olacaksınız.
when (anchorResult) {
is AnchorCreateSuccess ->
Subspace(FollowTarget.anchor(anchorResult.anchor)) {
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
PlaceIndicator(place)
}
}
else ->
Log.e("Demo", "Failed to create anchor $anchorResult")
}Bu nedenle, Geospatial API'nin mükemmel yol bulma deneyimleri sunabileceğine ve Glimmer ile tasarım yapmanın, özellikle şeffaf ekranlarınız için tasarlanmış, göz atılabilir kullanıcı deneyimleri oluşturmaya yardımcı olacağına inanıyoruz.
Geospatial API hakkında daha fazla bilgi için kısa süre önce güncellenen developer.android.com/xr adresini ziyaret edin.
Şimdi sözü Yasmine'e bırakıyorum.
Bu oturumda Android XR'ın bazı özelliklerini (Jetpack XR için ARCore ve Jetpack Compose Glimmer) inceledik.
Android XR'ın kablolu XR gözlüklere getireceği yeni özellikler bizi heyecanlandırıyor.
Geliştiriciler Android XR için uygulama geliştirmeye başladı bile. Sizin yaratıcı çalışmalarınızı da Google Play Store'da görmeyi umuyoruz.
Başlamak için geliştirici belgelerimizi inceleyebilir, XR denemelerimizden ilham alabilir ve codelab'lerle hemen işe koyulabilirsiniz.
Hepiniz için çok sayıda harika XR oturumu, demo ve atölye çalışması planladık.
Sürükleyici ve artırılmış deneyimler için Android XR'da geliştirme hakkında bilgi edinmek üzere oturumu izleyin.
Android XR Ekibi adına, burada olduğunuz için hepinize çok teşekkür ederiz. Android Developer Summit'in geri kalanında iyi vakit geçirmenizi dileriz.
Teşekkürler.
android skills add display-glasses-with-jetpack-compose-glimmerval brandColor = Color(0xFFFFAABB)
val focusedColor = ButtonDefaults.focusedColor(brandColor)
Column(…) {
LeadingImageCard(
focusable = false,
…
) {
…
}
ButtonGroup(...) {
Button(
onClick = {},
leadingIcon = { … },
focusedColor = focusedColor,
) { Text("Add to cart") }
/* Rest of the buttons */
}
}val pagerState =
rememberGlimmerPagerState(pageCount = { 10 })
GlimmerHorizontalPager(pagerState) { page ->
/* Card Content */
}ButtonGroup {
Button(onClick = {}) { Text("Button 1") }
Button(onClick = {}) { Text("Button 2") }
Button(onClick = {}) { Text("Button 3") }
Button(onClick = {}) { Text("Button 4") }
Button(onClick = {}) { Text("Button 5") }
}var buttonChecked by remember { mutableStateOf(false) }
ToggleButton(
checked = buttonChecked,
leadingIcon = { Icon(FavoriteIcon) },
onCheckedChange = { buttonChecked = it }
) {
Text(if (buttonChecked) "On" else "Off")
}Subspace {
SpatialPanel {
VideoPlayer()
}
}val state by
qrCode.state.collectAsState()
Subspace(FollowTarget.anchor(anchor)) {
SpatialPanel {
Row {
IndicatorDot()
Spacer()
QrCodeCard(state)
}
}
}produceState<AppStatus>(Initializing) {
val geospatial = Geospatial.getInstance(session)
val wait = geospatial.state.onEach {
value = WaitingForGeospatial(it.geospatialTrackingState)
}.first {
it.geospatialTrackingState == Geospatial.GeospatialTrackingState.RUNNING
}
val accuracyWait = geospatial.state.onEach {
value = WaitingForGeospatialAccuracy(it)
}.first { it.horizontalAccuracy < horizontalAccuracyRequirement }
value = WaitingForPlacesResults
val result = client.findNearby(context, accWait.geospatialPose)
value = Done(result)
}val bounds = CircularBounds.newInstance(
LatLng(pose.latitude, pose.longitude),
100.0, // radius, in meters
)
val placeFields = listOf(
Place.Field.ID, Place.Field.DISPLAY_NAME,
Place.Field.RATING, Place.Field.LOCATION,
)
return placesClient.searchNearby(
SearchNearbyRequest.builder(bounds, placeFields)
.setIncludedTypes(listOf(PlaceTypes.CAFE))
.setMaxResultCount(10)
.build()
).await()val anchorResult by produceState<AnchorResult?>(null) {
val geospatial = Geospatial.getInstance(session)
value = geospatial.createAnchorOnSurface(
place.location.latitude, place.location.longitude,
surface = GeospatialSurface.TERRAIN,
altitudeAboveSurface = 3.0,
eastUpSouthQuaternion = Quaternion()
)
}when (anchorResult) {
is AnchorCreateSuccess ->
Subspace(FollowTarget.anchor(anchorResult.anchor)) {
SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
PlaceIndicator(place)
}
}
else ->
Log.e("Demo", "Failed to create anchor $anchorResult")
}