Wejście obrotowe

Niektóre urządzenia z Wear OS mają fizyczny obracający się przycisk z boku. Gdy użytkownik obróci przycisk, przewija bieżący widok aplikacji w górę lub w dół. Ten typ danych wejściowych jest nazywany wejściem obrotowym.

Uwaga: ten przewodnik dotyczy głównie obsługi danych pokrętnych w interfejsach opartych na widoku danych. Więcej informacji o obsłudze pokrętła w funkcji Utwórz w Wear OS znajdziesz w tym artykule.

Wiele kontenerów z możliwością przewijania, np. ScrollView, ListView, HorizontalScrollView i WearableRecyclerView, obsługuje pokrętło, jeśli znajduje się w nim fokus, nie wymagając przy tym żadnego kodu powiązanego z Wear OS. Musisz określić, na czym warto się skupić, ponieważ na Androidzie 9 (poziom interfejsu API 28) i nowszym widoki nie są uwzględniane w koncentracji.

Koncentracja na sprawdzonych metodach

Aby reagować na zdarzenia wejścia-wyjścia obrotowego, kontener z możliwością przewijania musi być aktywny. Zdarzenia wejściowe rotacji nie zbierają się w hierarchii widoków. Jeśli nie ma aktywnego widoku lub aktywny widok zwraca wartość false z tabeli View.onGenericMotionEvent(), zdarzenie jest wysyłane do usługi Activity.onGenericMotionEvent().

Oto sprawdzone metody reagowania na zdarzenia obrotowe danych wejściowych:

  • Pamiętaj, że uruchomienie działania lub nawet kliknięcie widoku nie powoduje zaznaczenia go, nawet jeśli można go zaznaczyć. Aby widok był aktywny, widok musi używać tagu <requestFocus /> lub ręcznie wywoływać metodę View.requestFocus().
  • Oznacz niestandardowe widoki przewijane jako możliwe do zaznaczenia za pomocą elementów android:focusable="true" i android:focusableInTouchMode="true".
  • Jeśli widok z możliwością przewijania jest dołączony po Activity.onCreate(), na przykład gdy czekasz na zakończenie żądania sieciowego przed utworzeniem interfejsu użytkownika, po dołączeniu wywołaj requestFocus().
  • Jeśli początkowo widok, który można przewijać, to INVISIBLE lub GONE, wywołaj requestFocus(), ustawiając go na VISIBLE.
  • Jeśli aktywność obejmuje wiele widoków, które można przewijać, wybierz ten, na którym chcesz skupić się za pomocą tagu <requestFocus />. Zagnieżdżone przewijanie nie jest obsługiwane po włączeniu obracającego się przycisku bocznego.
  • Jeśli interfejs użytkownika zawiera inny widok, który wymaga uwagi, gdy użytkownik wchodzi z nim w interakcję – na przykład interfejs InputText – zapewnij użytkownikowi możliwość przywrócenia widoku do przewijania, jeśli straci on zaznaczenie, nasłuchiwanie kliknięć tego widoku i wywoływanie w odpowiedzi requestFocus().

Niestandardowe działanie rotacji

Jeśli widok z możliwością przewijania nie obsługuje pokrętła natywnie lub jeśli chcesz używać pokrętła do czegoś innego niż przewijanie (np. do powiększania i pomniejszania widoku lub obracania pokrętła), możesz obsługiwać zdarzenia przewijania samodzielnie. Pamiętaj, aby skupić się na widoku, bo inaczej zdarzenia nie zostaną uwzględnione.

Ten fragment kodu pokazuje, jak za pomocą elementów MotionEvent, InputDeviceCompat i ViewConfigurationCompat dodać przewijanie niestandardowe do widoku:

Kotlin

myView.setOnGenericMotionListener { v, ev ->
  if (ev.action == MotionEvent.ACTION_SCROLL &&
      ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
  ) {
    // Don't forget the negation here
    val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
        ViewConfigurationCompat.getScaledVerticalScrollFactor(
             ViewConfiguration.get(context), context
        )
    // Swap these axes to scroll horizontally instead
    v.scrollBy(0, delta.roundToInt())
    true
  } else {
    false
  }
}

Java

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
  @Override
  public boolean onGenericMotion(View v, MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_SCROLL &&
        ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
    ) {
      // Don't forget the negation here
      float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
          ViewConfigurationCompat.getScaledVerticalScrollFactor(
               ViewConfiguration.get(context), context
          );

      // Swap these axes to scroll horizontally instead
      v.scrollBy(0, Math.round(delta));

      return true;
    }
    return false;
  }
});

Testowanie za pomocą emulatora

Użyj emulatora Androida, aby symulować pokrętło przewijania na urządzeniu Wear. Uruchom aplikację Wear w emulatorze, by uruchomić projekt, lub przeciągnij plik APK do emulatora, by go zainstalować.

Aby przetestować pokrętło w emulatorze:

  1. W Menedżerze pakietów SDK użyj karty Narzędzia SDK, aby pobrać Emulator Androida w wersji 26.0.3 lub nowszej.
  2. W Android Studio wybierz Narzędzia > Android > Menedżer AVD. Utwórz nowe urządzenie Wear z interfejsem API 25 lub nowszym.
  3. Uruchom emulator z Androida Studio.
  4. Kliknij rozszerzone menu z 3 kropkami na dole paska narzędzi emulatora. W nowym oknie kliknij kartę Obrót danych wejściowych, by otworzyć pokrętło w interfejsie i spróbuj przewijania za pomocą pokrętła.

Poniższy film przedstawia pokrętło używane w emulatorze: