Wear'da bilek hareketlerini kullanma

Dokunmatik ekran rahatsız edici olduğunda bilek hareketleri sayesinde uygulamanızla tek elle hızlı şekilde etkileşimde bulunabilirsiniz.

Örneğin, kullanıcı bir eliyle bir bardak su tutarken bildirimler arasında gezinebilir. Bilek hareketlerinin diğer kullanım alanları şunlardır:

  • Tempolu koşu uygulamasında atılan adım sayısını, geçen süreyi ve mevcut tempoyu gösteren dikey ekranlarda gezinme
  • Bir seyahat uygulamasında uçuş ve kapı bilgileri arasında gezinerek
  • Bir haber uygulamasında, makaleler arasında gezinirken

Bir kol saati cihazında bilek hareketlerini incelemek için Ayarlar > Gelişmiş özellikler > Hareketler > Bilek Hareketleri Açık'ı seçerek hareketlerin açık olduğunu onaylayın. Ardından, Eğitimi Başlat'ı seçerek kol saatinde Hareketler eğitimini tamamlayın.

Not: Bileği sallama, sistem genelinde geri veya geri alma hareketidir ve uygulamalar tarafından özelleştirilemez.

Bilek hareketleri, bu kılavuzda açıklandığı gibi aşağıdaki şekillerde kullanılabilir:

Her bilek hareketi, aşağıdaki tabloda gösterildiği gibi KeyEvent sınıfındaki bir int sabitine eşlenir:

Hareket Önemli etkinlik Açıklama
Bileğinizi dışarı doğru çevirin KEYCODE_NAVIGATE_NEXT Bu anahtar kodu bir sonraki öğeye gider.
Bileğinizi içeri doğru çevirin KEYCODE_NAVIGATE_PREVIOUS Bu anahtar kodu önceki öğeye gider.

Bilek hareketlerini desteklemek için kavisli bir düzen kullanın

WearableRecyclerView sınıfı, listeler için eğri bir düzen sağlar ve bilek hareketlerini otomatik olarak destekler. Sınıfta, görünümde oda olduğunda bilek hareketlerinin gerçekleştirilmesi için önceden tanımlanmış işlemler vardır. WearableRecyclerView sınıfını kullanma hakkında bilgi edinmek için Wear OS'te liste oluşturma başlıklı makaleye göz atın. Ayrıca bu kılavuzun En iyi uygulamalar bölümünü inceleyin.

Not: WearableRecyclerView sınıfı, Wearable Destek Kitaplığı'ndaki benzer, kullanımdan kaldırılmış sınıfın yerini alır.

WearableRecyclerView kullansanız bile KeyEvent sınıfındaki sabit değerleri kullanmak isteyebilirsiniz. Önceden tanımlanmış işlemler, WearableRecyclerView alt sınıfı alt sınıflandırılarak ve onKeyDown() geri çağırması yeniden uygulanarak geçersiz kılınabilir. Bu davranış, setEnableGestureNavigation(false) kullanılarak tamamen devre dışı bırakılabilir. Daha fazla bilgi için Klavye işlemlerini işleme bölümüne bakın.

Önemli etkinlikleri doğrudan kullanma

Hareket etkinliklerine yanıt olarak yeni işlemleri tetiklemek için WearableRecyclerView dışındaki önemli etkinlikleri kullanabilirsiniz. Daha da önemlisi, bu hareket etkinlikleri cihaz etkin moddayken tanınır ve tüm önemli etkinliklerle aynı şekilde sunulur.

View veya Activity gibi kullanıcı etkileşimiyle ilgili olan ve KeyEvent.Callback uygulayan bir sınıf, bilek hareketleriyle ilgili önemli etkinlikleri, diğer önemli etkinliklerde listelenebileceği gibi dinleyebilir. Android çerçevesi, önemli etkinliklere odaklanan View veya Activity öğelerini çağırır. Hareketler söz konusu olduğunda, hareketler gerçekleştiğinde onKeyDown() yöntemi geri çağırmaya çağrılır.

Örneğin, bir uygulama KeyEvent.Callback özelliğini uygulayan bir View veya Activity içinde önceden tanımlanmış işlemleri aşağıdaki şekilde geçersiz kılabilir:

Kotlin

class GesturesActivity : Activity() {

    /* KeyEvent.Callback */
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_NAVIGATE_NEXT ->
                // Do something that advances a user View to the next item in an ordered list.
                moveToNextItem()
            KeyEvent.KEYCODE_NAVIGATE_PREVIOUS ->
                // Do something that advances a user View to the previous item in an ordered list.
                moveToPreviousItem()
            else -> {
                // If you did not handle it, let it be handled by the next possible element as determined
                // by the Activity.
                super.onKeyDown(keyCode, event)
            }
        }
    }

    /** Shows the next item in the custom list.  */
    private fun moveToNextItem(): Boolean {
        ...
        // Return true if handled successfully, otherwise return false.
        return false
    }

    /** Shows the previous item in the custom list.  */
    private fun moveToPreviousItem(): Boolean {
        ...
        // Return true if handled successfully, otherwise return false.
        return false
    }
}

Java

public final class GesturesActivity extends Activity {

 @Override /* KeyEvent.Callback */
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  switch (keyCode) {
   case KeyEvent.KEYCODE_NAVIGATE_NEXT:
    // Do something that advances a user View to the next item in an ordered list.
    return moveToNextItem();
   case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
    // Do something that advances a user View to the previous item in an ordered list.
    return moveToPreviousItem();
  }
  // If you did not handle it, let it be handled by the next possible element as determined by the Activity.
  return super.onKeyDown(keyCode, event);
 }

 /** Shows the next item in the custom list. */
 private boolean moveToNextItem() {
  boolean handled = false;
  ...
  // Return true if handled successfully, otherwise return false.
  return handled;
 }

 /** Shows the previous item in the custom list. */
 private boolean moveToPreviousItem() {
  boolean handled = false;
  ...
  // Return true if handled successfully, otherwise return false.
  return handled;
 }
}

En iyi uygulamalar

  • Önemli etkinliklerin View ve Activity cihazlarınıza gönderilmesi hakkında bilgi edinmek için KeyEvent ve KeyEvent.Callback sayfalarını inceleyin.
  • Yönleri tutarlı bir şekilde koruyun: Sonraki video için "bileğinizi dışarı doğru çevirin", önceki video için de "bileği içeriye çevirin" ifadelerini kullanın.
  • Bir hareket için paralel dokunun.
  • Görsel geri bildirim sağlayın.
  • Sistemin geri kalanına aykırı olabilecek işlevler uygulamak için anahtar kodu kullanmayın. Örneğin, bir işlemi iptal etmek veya kısa hareketlerle sol-sağ eksende gezinmek için KEYCODE_NAVIGATE_NEXT işlevini kullanmayın.
  • Ekran dışındaki veya kısmen kapsanan görünümler gibi kullanıcı arayüzünün parçası olmayan öğelerdeki önemli etkinliklere müdahale etmeyin. Bu, tüm önemli etkinliklerle aynıdır.
  • Tekrarlanan kaydırma hareketlerini kendi özgün hareketinizle yeniden yorumlamayın. Bu ayar, sistemin "bileği sallama" hareketiyle çakışabilir.
  • Bir görünümün hareket önemli etkinliklerini alabilmesi için odak olması gerekir (bkz. View.setFocusable()).

    Hareketler önemli etkinlikler olarak değerlendirildiğinden, beklenmedik şeyler yapabilecek "dokunma modundan" bir geçişi tetikler. Kullanıcılar dokunma ve hareketleri kullanma arasında geçiş yapabildiğinden View::setFocusableInTouchmode() yöntemi gerekli olabilir. Bazı durumlarda, dokunma moduna geçtikten veya bu moddan çıktıktan sonra odak değiştiğinde, amaçladığınız görünüme odaklanılması için setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS) kullanılması da gerekebilir.

  • requestFocus() ve clearFocus() politikalarını kullanırken dikkatli olun:
    • requestFocus() çağrısı yapılırken görünüm için odaklamanın uygun olduğundan emin olun. Görüntü ekranın dışındaysa veya başka bir görünümle örtüşüyorsa geri çağırma hareketlerini tetiklediğinde sürprizlerle karşılaşabilirsiniz.
    • clearFocus() yöntemi, başka bir uygun görünüm bulmak için odak araması başlatır. Görünüm hiyerarşisine bağlı olarak, bu arama için önemsiz olmayan hesaplamalar gerekebilir. Bu işlem, odaklanmayı beklemediğiniz bir görünüme de odaklanılmasına yol açabilir.
  • Önemli etkinlikler, görünüm hiyerarşisine odaklanarak ilk olarak görünüme iletilir. Odaklanmış görünüm etkinliği gerçekleştirmiyorsa (diğer bir deyişle, false değerini döndürürse) etkinlik, odağı alabiliyor ve bir KeyListener öğesine sahip olsa bile üst görünüme yayınlanmaz. Bunun yerine, etkinlik, odağın korunduğu görünüm hiyerarşisini tutan mevcut etkinliğe iletilir.

    Dolayısıyla, tüm etkinlikleri daha üst düzeyde yakalamak ve ardından ilgili kodları aktarmak gerekebilir. Alternatif olarak, etkinliği alt sınıflandırabilir ve gerektiğinde anahtarlara müdahale etmek veya alt katmanlarda kullanılmadıklarında bunları işlemek için dispatchKeyEvent(KeyEvent event) yöntemini geçersiz kılabilirsiniz.