旋轉輸入

Stay organized with collections Save and categorize content based on your preferences.

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

許多可捲動的容器 (例如 ScrollViewListViewHorizontalScrollViewWearableRecyclerView) 支援旋轉輸入,且不需要任何 Wear OS-特定程式碼,如果這些容器聚焦的話。有聚焦是一項重要的先決條件,因為在 Android 9 (API 級別 28) 以上版本中,檢視畫面不會間接接收焦點。

聚焦最佳做法

為回應旋轉輸入事件,可捲動的容器必須聚焦。以下是回應旋轉輸入事件的最佳做法:

  • 根據預設,即便是可聚焦的活動,即使啟動或輕觸檢視畫面,也不會聚焦。如要聚焦檢視畫面,檢視畫面必須使用 <requestFocus /> 標記,或手動呼叫 View.requestFocus()
  • 使用 android:focusable="true"android:focusableInTouchMode="true",將自訂可捲動檢視畫面標示為可聚焦。
  • 旋轉輸入事件只會傳送至聚焦的檢視畫面。這些事件不會彈出檢視區塊階層。如果沒有聚焦檢視畫面,或如果聚焦的檢視畫面從 View.onGenericMotionEvent() 傳回 false,則事件會傳送至 Activity.onGenericMotionEvent()
  • 如果在 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 模擬器 26.0.3 以上版本。
  2. 在 Studio 中,選取「Tools」>「Android」>「AVD Manager」。 使用 API 25 以上版本建立新的 Wear 裝置
  3. 透過 Android Studio 執行模擬器
  4. 按一下溢位按鈕 (模擬器工具列底部的三點圖示)。在新視窗中按一下「Rotary input」分頁標籤,即可開啟旋轉輸入介面,並嘗試以旋轉輸入捲動。

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