Wear OS 7 (API düzeyi 37) ve sonraki sürümlerde, tek elle yapılan hareket çerçevesi ve Wear OS için Compose'un bir parçası olan API, kullanıcıların uygulamanızla dokunmadan etkileşim kurmasına olanak tanır.
Başlangıçta Pixel Watch cihazlarda (Pixel Watch 3 ve sonraki modeller) desteklenen bu çerçeve, tüm OEM'ler tarafından kullanılabilir. Bu API'yi kullanarak uygulamanızın hareket desteği, donanım desteği genişledikçe ekosistem genelinde otomatik olarak ölçeklenir.
Wear OS çerçevesi, kullanıcıların kullanıcı arayüzünü karmaşıklaştırmadan kullanılabilir hareketleri keşfetmesine yardımcı olmak için animasyonlu hareket göstergeleri sağlar. Bu görsel ipuçları, hareketin nerede yapılabileceğini vurgular. Sistem, kullanıcı tercihlerine göre ipuçlarının gösterilme sıklığını ve sessize alma sıklığını otomatik olarak yönetir.
Desteklenen hareketler ve işlemler
Wear OS hareket çerçevesi iki hareket türünü destekler:
- Birincil işlem (İki parmakla iki kez dokunma): Ekrandaki ana işlemle (ör. aramayı yanıtlama veya medya oynatmayı açma/kapatma) eşlenir.
- Kapatma işlemi (bilek döndürme): Geri gezinme, iletişim kutusunu kapatma veya istemi iptal etme işlemlerini yapar.
Compose'da hareketleri yapılandırma
Tek elle yapılan hareketler API'si, kullanıcı arayüzünüzü iyileştirebilse de bazı donanımların ve OEM'lerin bu hareketleri desteklemediğini unutmayın. API, uygulamanızın bu desteklenmeyen cihazlardan birinde çalıştığını algılarsa kitaplık, standart dokunma etkileşimlerini etkilemeden otomatik olarak işlem yapmaz.
Standart Oluşturma davranışlarında olduğu gibi, değiştiricileri kullanarak kullanıcı arayüzü öğelerinde tek elle yapılan hareketleri etkinleştirebilirsiniz. Uygulamanızın hareketlerini, gerçekleştirilecek işleme (birincil veya kapatma) göre yapılandırır ve ipucu görüntüleme hızı ve sıklık kapatma gibi sistem düzeyindeki kullanıcı tercihlerini koordine etmek için bir gestureId kullanırsınız. Bu yapılandırmayı bir OneHandedGestureConfiguration nesnesi oluşturarak ifade edersiniz. Bu nesneyi oluşturmak için rememberOneHandedGestureConfiguration işlevini kullanmanızı öneririz. OneHandedGestureConfiguration,
hareket önceliğini de belirleyebileceğiniz yerdir.
rememberOneHandedGestureConfiguration işlevi, uygulama durumunu göstermeden yeniden oluşturma işlemleri genelinde kullanıcı etkileşimi geçmişini izler. Uygulamanız yapılandırmayı oluşturduktan sonra yapılandırmayı etkileşimli composable'ınızdaki Modifier.oneHandedGesture öğesine iletmelidir.
Kitaplık, kullanıcıların kullanılabilir hareketleri keşfetmesine yardımcı olmak için OneHandedGestureClickIndicator yöntemini sağlar. Bu yöntem, kullanıcıya bir hareket işleminin kullanılabildiğini belirtmek için temel içeriğini değiştiren bir sarmalayıcı görevi görür.
Etkileşimli bileşenler
Düğme gibi etkileşimli bir kontrolde hareketleri etkinleştirmek için OneHandedGestureAction.Primary değerini belirten bir yapılandırma oluşturun ve oneHandedGesture değiştiricisini uygulayın. Hareket etkinliklerinin denetim üzerinde görsel basma geri bildirimi vermesi için hem denetime hem de değiştiriciye aynı MutableInteractionSource değerini iletin.
Hareket göstergesini etkinleştirmek için bir OneHandedGestureClickIndicatorState örneği oluşturun ve bunu hatırlayın. Ardından, görsel geri bildirimi tetiklemek için oneHandedGesture değiştiricisi tarafından sağlanan onGestureAvailable geri çağırma işlevinde showIndicator yöntemini çağırın. Bu yöntem, sisteme bir gösterge etkinliğinin gerçekleştiğini bildirir. Çağrıldığında bileşen, normal içeriğini kısa bir süreliğine hareket animasyonuyla değiştirir.
var isPlaying by remember { mutableStateOf(false) } val onClick = { isPlaying = !isPlaying } val gestureConfig = rememberOneHandedGestureConfiguration( action = OneHandedGestureAction.Primary ) val indicatorState = remember { OneHandedGestureClickIndicatorState() } val coroutineScope = rememberCoroutineScope() val interactionSource = remember { MutableInteractionSource() } Button( onClick = onClick, interactionSource = interactionSource, modifier = Modifier .fillMaxWidth() .oneHandedGesture( gestureConfiguration = gestureConfig, interactionSource = interactionSource, onGestureLabel = if (isPlaying) "pause" else "play", onGestureAvailable = { coroutineScope.launch { indicatorState.showIndicator() } }, onGesture = onClick ) ) { OneHandedGestureClickIndicator( gestureConfiguration = gestureConfig, state = indicatorState ) { Text(if (isPlaying) "Pause" else "Play", modifier = Modifier.fillMaxWidth()) } }
Kaydırılabilir kapsayıcılar
Kaydırılabilir ekranlar veya listeler için OneHandedGestureAction.Primary değerini belirten bir yapılandırma oluşturun ve oneHandedGesture değiştiricisini kapsayıcınıza uygulayarak scrollDown gibi bir kaydırma yardımcısını çağırın.
Kaydırma işlemleri için görsel geri bildirim sağlamak üzere OneHandedGestureScrollIndicator kullanabilirsiniz. Bu bileşen, kaydırma konumunu gösteren standart bir kaydırma göstergesi olarak işlev görür ancak kullanıcının kaydırma hareketini kullanabileceğini de gösterebilir. Bu gösterge genellikle bir ScreenScaffold öğesinin scrollIndicator alanına iletilir ve TransformingLazyColumn gibi kaydırılabilir bir kapsayıcının durumuyla birleştirilir. Ayrıca görsel geçişlerini yönetmek için OneHandedGestureScrollIndicatorState kullanır.
Görsel geri bildirimi tetiklemek için bu durumda showIndicator işlevini çağırın. Bu işlem genellikle oneHandedGesture değiştiricisinin onGestureAvailable geri çağırma işlevinde yapılır.
Tetiklendiğinde gösterge, kullanıcıyı uyarmak için standart görsel durumunu geçici olarak bir hareket animasyonu dizisiyle değiştirir.
val scrollState = rememberTransformingLazyColumnState() val gestureConfig = rememberOneHandedGestureConfiguration( action = OneHandedGestureAction.Primary, priority = OneHandedGesturePriority.Scrollable ) val indicatorState = remember(gestureConfig) { OneHandedGestureScrollIndicatorState() } val coroutineScope = rememberCoroutineScope() ScreenScaffold( scrollState = scrollState, scrollIndicator = { OneHandedGestureScrollIndicator( gestureConfiguration = gestureConfig, indicatorState = indicatorState, scrollState = scrollState, modifier = Modifier.align(Alignment.CenterEnd) ) } ) { contentPadding -> TransformingLazyColumn( state = scrollState, contentPadding = contentPadding, modifier = Modifier .fillMaxSize() .oneHandedGesture( gestureConfiguration = gestureConfig, onGestureLabel = "scroll", onGestureAvailable = { coroutineScope.launch { indicatorState.showIndicator() } }, onGesture = { OneHandedGestureDefaults.scrollDown(scrollState) } ) ) { items(10) { index -> Text("Item $index", modifier = Modifier.padding(8.dp)) } } }
Birden fazla hareketi birleştirme
OneHandedGestureConfiguration nesnenize gesturePriority ekleyerek hem kaydırma hareketini hem de tıklama hareketini aynı birincil işlemle yapılandırabilirsiniz:
OneHandedGesturePriority.Clickable(en yüksek): Ekranda göründüklerinde hareketleri yakalamaları için etkileşimli kontrollere (ör.ButtonveyaCardtüründekiler) atayın.OneHandedGesturePriority.Scrollable(orta): Tıklanabilir alt öğelere öncelik vermeleri ancak tıklanabilir kontrol görünür olmadığında kaydırmaları için kaydırılabilir veya sayfalara ayrılabilir kapsayıcılara atayın.OneHandedGesturePriority.Unspecified(en düşük): Atanmamış bir öncelik. Bu,priorityayarlanmamış bir hareketin varsayılan değeridir.
İç düğmede priority = OneHandedGesturePriority.Clickable, üst listede ise priority = OneHandedGesturePriority.Scrollable açıkça ayarlanarak sistemin bu hareket öncelikli davranışı göstermesi sağlanabilir.
Kullanıcı, tek elle yapılan hareketle birincil işlemi tetiklediğinde önce düğme görünene kadar listeyi aşağı kaydırır, ardından düğmenin tıklama işlemini yakalar.
ADB ile hareketleri test etme ve hatalarını ayıklama
Android Debug Bridge (adb) ve IWearGestureService sistem hizmetini kullanarak fiziksel bilek hareketleri yapmadan fiziksel bir cihazda veya emülatörde tek elle yapılan hareketleri test edebilirsiniz.
Hareket simülasyonunu etkinleştirme
ADB kullanarak hareketleri simüle etmeden önce cihaz ayarlarınızı ve kısıtlama geçersiz kılmalarınızı yapılandırın:
Wear OS cihazınızda Wear OS 7 (API düzeyi 37) veya sonraki bir sürümün yüklü olduğunu doğrulayın:
adb shell getprop ro.build.version.sdkBileğinizde olmayan veya şarj cihazında duran fiziksel bir cihazda test yapıyorsanız hareket çerçevesinin etkin kalması için vücut dışı kısıtlamayı geçersiz kılın:
adb shell cmd IWearGestureService override-constraints offbody-state
ADB kullanarak hareket etkinliklerini tetikleme
İki parmakla sıkıştırma hareketini (Pixel Watch'larda Primary işlemi) simüle etmek için aşağıdaki ADB kabuk komutunu çalıştırın:
adb shell cmd IWearGestureService gesture DoublePinch
Bileği döndürme hareketini (Pixel Watch'larda Dismiss işlemi) simüle etmek için aşağıdaki adb kabuk komutunu çalıştırın:
adb shell cmd IWearGestureService gesture WristTurn
Hareket ipucu izlemeyi sıfırla
Sistem, kullanıcı etkileşim geçmişini izler ve genel ritim ayarına (ör. Her zaman veya Günlük) göre kayan hareket ipuçları gösterir. Uygulamanızın hareket göstergelerinde hata ayıklarken bu izleme geçmişini sıfırlayarak paketiniz için ipuçlarının tekrar görünmesini sağlayın:
userdebugderlemelerinde veya emülatörlerinde:adb shell cmd IWearGestureService hint clear <your_package_name>Perakende (
user) derlemelerinde:Root erişimi olmayan ticari cihazlarda
hint clear, sistem izinleri tarafından engellenir. İpucu keşfini sıfırlamak için uygulamanın yerel verilerini temizleyin:adb shell pm clear <your_package_name>
Varsayılan kısıtlamaları geri yükle
Testi tamamladığınızda tüm hata ayıklama kısıtlaması geçersiz kılma işlemlerini sıfırlamak için:
adb shell cmd IWearGestureService override-constraints reset
Hareket ekleme sorunlarını giderme
Uygulamanız simüle edilmiş hareketleri almıyorsa:
Saat ekranının uyandırıldığından ve AÇIK olduğundan emin olun. Hareket çerçevesi, ekran kapalıyken veya ambiyans modundayken uygulamalara hareket göndermez. ADB kullanarak ekranı uyandırmak için şu komutu çalıştırın:
adb shell input keyevent KEYCODE_WAKEUPUygulamanızın etkin bir hareket abonesi olarak kayıtlı olup olmadığını ve pencere odağının şu anda uygulamada olup olmadığını kontrol edin:
adb shell cmd IWearGestureService get-active-gestures -readableUygulamanızın hareket ekranı ön planda ve ekran uyanıkken bu komut
[DoublePinch]veya[DoublePinch, WristTurn]değerini döndürür. Boş bir liste ([]) döndürülürse pencerenizin odakta olup olmadığını veya vücut dışı kısıtlamaların etkinleştirmeyi engelleyip engellemediğini kontrol edin.Dahili hareket hizmeti durumunu ve etkin abone jetonlarını inceleyin:
adb shell dumpsys IWearGestureService
Ek kaynaklar
Tek elle yapılan hareketlerin ne zaman ve nerede kullanılacağına dair tasarım rehberliği için Tek elle yapılan hareketler başlıklı makaleyi inceleyin.
Sizin için önerilenler
- Not: JavaScript devre dışı bırakıldığında bağlantı metni gösterilir.
- Tek elle yapılan hareketler için tasarım kılavuzu