旋轉輸入

部分 Wear OS 裝置包含實體「側邊旋轉按鈕」。使用者轉動按鈕時,會向上或向下捲動應用程式目前的檢視畫面。這種輸入類型稱為「旋轉輸入」

注意:本指南主要討論如何使用以 View 為基礎的 UI 處理旋轉輸入。如要進一步瞭解如何使用 Compose for Wear OS 處理旋轉輸入,請參閱「Compose 上的旋轉輸入」一文。

許多可捲動的容器 (例如 ScrollViewListViewHorizontalScrollViewWearableRecyclerView) 都支援旋轉輸入,且無須使用任何 Wear OS 專用程式碼,但前提是這些容器要能聚焦。能聚焦是一項重要的先決條件,因為在 Android 9 (API 級別 28) 以上版本中,檢視畫面不會間接接收焦點。

聚焦最佳做法

為回應旋轉輸入事件,可捲動的容器必須擁有焦點。旋轉輸入事件不會彈出檢視區塊階層。如果沒有聚焦檢視畫面,或如果聚焦的檢視畫面從 View.onGenericMotionEvent() 傳回 false,則事件會傳送至 Activity.onGenericMotionEvent()

以下是回應旋轉輸入事件的最佳做法:

  • 請注意,根據預設,即便是可聚焦的活動或檢視畫面,即使啟動或輕觸也無法聚焦。如要聚焦檢視畫面,檢視畫面必須使用 <requestFocus /> 標記,或手動呼叫 View.requestFocus()
  • 使用 android:focusable="true"android:focusableInTouchMode="true",將自訂可捲動檢視畫面標示為可聚焦。
  • 如果在 Activity.onCreate() 之後附加了可捲動的檢視畫面 (例如在建構 UI 之前等待網路要求完成),請在附加後呼叫 requestFocus()
  • 若可捲動檢視畫面的初始畫面為 INVISIBLEGONE,請在初始畫面設定成 VISIBLE 時呼叫 requestFocus()
  • 如果您的活動包含多個可捲動的檢視畫面,請使用 <requestFocus /> 標記選擇要聚焦的檢視畫面。側邊旋轉按鈕不支援巢狀捲動功能。
  • 如果 UI 包含其他檢視區塊,且使用者與其互動時 (例如 InputText),系統會轉而聚焦這些檢視區塊,請提供使用者方法,將被轉移的焦點還原到可捲動檢視區塊。這可以藉由監聽可捲動檢視區塊上的輕觸動作,並呼叫 requestFocus() 回應來執行。

自訂旋轉行為

如果可捲動檢視畫面的原生支援,不包括旋轉輸入捲動功能,或是您想使用旋轉輸入項目執行捲動以外的操作 (例如放大/縮小或轉盤),您可以自行操控捲動事件。務必確保您的檢視畫面取得聚焦,否則事件無法順利執行。

下列程式碼片段說明如何使用 MotionEventInputDeviceCompatViewConfigurationCompat,在檢視畫面中新增自訂捲動功能:

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;
  }
});

使用模擬器進行測試

使用 Android 模擬器模擬 Wear 裝置的旋轉輸入捲動功能。在模擬器上啟動 Wear 應用程式以執行專案,或是將 APK 檔案拖曳至模擬器上安裝。

如何在模擬器上測試旋轉輸入功能:

  1. SDK Manager 中,透過「SDK tools」分頁取得 Android Emulator 26.0.3 以上版本。
  2. 在 Android Studio 中,依序選取「Tools」>「Android」>「AVD Manager」。使用 API 25 以上版本建立新的 Wear 裝置
  3. 從 Android Studio 執行模擬器
  4. 按一下模擬器工具列底部的三點溢位選單。在新視窗中按一下「Rotary input」分頁標籤,即可開啟旋轉輸入介面,試用旋轉輸入捲動功能。

以下影片展示模擬器中的旋轉輸入功能: