Wear OS 7 (API düzeyi 37) ile birlikte, Wear OS için Compose'un bir parçası olan bir API'nin yanı sıra tek elle kullanılan hareketler çerçevesi, 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 kullanmaya başladığınızda, donanım desteği genişledikçe uygulamanızın hareket desteği ekosistem genelinde otomatik olarak ölçeklenir.
Wear OS çerçevesi, kullanıcıların mevcut hareketleri kullanıcı arayüzünü karıştırmadan keşfetmesine yardımcı olmak için animasyonlu hareket göstergeleri sunar. Bu görsel ipuçları, hareketin nerede yapılabileceğini vurgularken sistem, kullanıcının tercihlerine göre gösterim 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 (Çift parmakla sıkıştırma): Ekranda yapılan ana işlemle (ör. aramayı yanıtlama veya medya oynatmayı açma/kapatma) eşlenir.
- İşlemi kapatma (bileği çevirme): Geriye doğru gezinme, iletişim kutusunu kapatma veya istemi iptal etme işlemlerini yapar.
Compose'da hareketleri yapılandırma
Tek elle kullanılan hareketler API'si kullanıcı arayüzünüzü iyileştirebilse de bazı donanımların ve OEM'lerin bu hareketleri desteklemediğini unutmamak önemlidir. 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 Compose davranışlarında olduğu gibi, kullanıcı arayüzü öğelerinde tek elle yapılan hareketleri değiştiriciler kullanarak etkinleştirirsiniz. Uygulamanızın hareketlerini, gerçekleştirilecek işleme (birincil veya kapatma) ve gestureId ipucu görüntüleme sıklığı ve frekansını kapatma gibi sistem düzeyindeki kullanıcı tercihlerine göre yapılandırı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 açığa çıkarmadan yeniden oluşturmalar 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, alttaki içeriğini değiştirerek kullanıcıya bir hareket işleminin kullanılabileceğini bildiren bir sarmalayıcı görevi görür.
Etkileşimli bileşenler
Düğme gibi etkileşimli bir kontrol üzerinde hareketleri etkinleştirmek için OneHandedGestureAction.Primary belirten bir yapılandırma oluşturun ve oneHandedGesture değiştiricisini uygulayın. Hareket etkinliklerinin kontrol üzerinde görsel basma geri bildirimi vermesi için hem kontrol hem de değiştiriciye aynı MutableInteractionSource değerini iletin.
Hareket göstergesini etkinleştirmek için OneHandedGestureClickIndicatorState örneği oluşturup hatırlayın. Ardından, görsel geri bildirimi tetiklemek için showIndicator işlevini oneHandedGesture değiştiricisi tarafından sağlanan onGestureAvailable geri arama işlevi içinde çağırın. Bu, sisteme bir belirtme etkinliğinin gerçekleştiğini bildirir. Çağrıldığında bileşen, normal içeriğini kısa bir süre için 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 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ı çağırın.
Kaydırma işlemleriyle ilgili görsel geri bildirim sağlamak için OneHandedGestureScrollIndicator simgesini 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 hareketi yapabileceğini de belirtebilir. Bu gösterge genellikle bir ScreenScaffold öğesinin scrollIndicator yuvasına iletilir ve TransformingLazyColumn gibi kaydırılabilir bir kapsayıcının durumuyla birlikte kullanılır. Ayrıca görsel geçişlerini yönetmek için OneHandedGestureScrollIndicatorState gözlemler.
Görsel geri bildirimi tetiklemek için bu durumda showIndicator işlevini çağırın. Bu işlev genellikle oneHandedGesture değiştiricisinin onGestureAvailable geri çağırma işlevinin içinde yer alır.
Tetiklendikten sonra 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
gesturePriority öğenize OneHandedGestureConfiguration ekleyerek hem kaydırma hem de tıklama hareketini aynı birincil işlemle yapılandırabilirsiniz:
OneHandedGesturePriority.Clickable(en yüksek): Ekranda göründüklerinde hareketleri yakalayabilmeleri içinButtonveyaCardtüründeki etkileşimli kontrollere atayın.OneHandedGesturePriority.Scrollable(orta): Tıklanabilir alt öğelere izin vermeleri ancak tıklanabilir bir kontrol görünmediğinde kaydırmaları için kaydırılabilir veya sayfalandırılabilir kapsayıcılara atayın.OneHandedGesturePriority.Unspecified(en düşük): Öncelik atanmamış. Bu,priorityayarlanmamış bir hareketin varsayılan değeridir.
Bir iç düğmede priority = OneHandedGesturePriority.Clickable, üst listede ise priority = OneHandedGesturePriority.Scrollable açıkça ayarlanarak sistemin bu hareket önceliği davranışı göstermesi sağlanabilir.
Kullanıcı, tek elle hareketle birincil işlemi tetiklediğinde önce liste, düğme görünene kadar aşağı kaydırılır. Ardından, düğmenin tıklama işlemi yakalanır.
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 hareketleri test edebilirsiniz.
Hareket simülasyonunu etkinleştirme
- 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.
- Bilekte veya şarj cihazında olmayan fiziksel bir cihazda test yapıyorsanız cihazın etkin kalması için vücut dışı sensör durumunu geçersiz kılın:
adb shell cmd sensorservice set-off-body-state 0
ADB kullanarak hareket etkinliklerini tetikleme
İki Parmakla Sıkıştırma hareketini (Pixel Watch'taki Primary işlemi) simüle etmek için aşağıdaki ADB kabuk komutunu çalıştırın:
adb shell cmd IWearGestureService gesture 1
Bileği Çevirme hareketini (Pixel Watch'taki Dismiss işlemi) simüle etmek için aşağıdaki ADB shell komutunu çalıştırın:
adb shell cmd IWearGestureService gesture 2
Hareket ipucu izlemeyi sıfırlama
Sistem, kullanıcı etkileşimi geçmişini izler ve genel sıklık 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ırlayın. Böylece paketiniz için ipuçları tekrar gösterilir:
adb shell cmd IWearGestureService hint clear <your_package_name>
Testi tamamladığınızda vücut dışı sensör durumunu sıfırlamak için:
adb shell cmd sensorservice reset-off-body-state
Ek kaynaklar
Tek el hareketlerinin ne zaman ve nerede kullanılacağıyla ilgili tasarım rehberliği için Tek el hareketleri başlıklı makaleyi inceleyin.
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Tek elle yapılan hareketler tasarım kılavuzu