部分 Wear OS 裝置包含實體「側邊旋轉按鈕」。使用者轉動按鈕時,會向上或向下捲動應用程式目前的檢視畫面。這種輸入類型稱為「旋轉輸入」。
注意:本指南主要討論如何使用以 View 為基礎的 UI 處理旋轉輸入。如要進一步瞭解如何使用 Compose for Wear OS 處理旋轉輸入,請參閱「Compose 上的旋轉輸入」一文。
許多可捲動的容器 (例如 ScrollView
、ListView
、HorizontalScrollView
和 WearableRecyclerView
) 都支援旋轉輸入,且無須使用任何 Wear OS 專用程式碼,但前提是這些容器要能聚焦。能聚焦是一項重要的先決條件,因為在 Android 9 (API 級別 28) 以上版本中,檢視畫面不會間接接收焦點。
聚焦最佳做法
為回應旋轉輸入事件,可捲動的容器必須擁有焦點。旋轉輸入事件不會彈出檢視區塊階層。如果沒有聚焦檢視畫面,或如果聚焦的檢視畫面從 View.onGenericMotionEvent()
傳回 false
,則事件會傳送至 Activity.onGenericMotionEvent()
。
以下是回應旋轉輸入事件的最佳做法:
- 請注意,根據預設,即便是可聚焦的活動或檢視畫面,即使啟動或輕觸也無法聚焦。如要聚焦檢視畫面,檢視畫面必須使用
<requestFocus />
標記,或手動呼叫View.requestFocus()
。 - 使用
android:focusable="true"
和android:focusableInTouchMode="true"
,將自訂可捲動檢視畫面標示為可聚焦。 - 如果在
Activity.onCreate()
之後附加了可捲動的檢視畫面 (例如在建構 UI 之前等待網路要求完成),請在附加後呼叫requestFocus()
。 - 若可捲動檢視畫面的初始畫面為
INVISIBLE
或GONE
,請在初始畫面設定成VISIBLE
時呼叫requestFocus()
。 - 如果您的活動包含多個可捲動的檢視畫面,請使用
<requestFocus />
標記選擇要聚焦的檢視畫面。側邊旋轉按鈕不支援巢狀捲動功能。 - 如果 UI 包含其他檢視區塊,且使用者與其互動時 (例如
InputText
),系統會轉而聚焦這些檢視區塊,請提供使用者方法,將被轉移的焦點還原到可捲動檢視區塊。這可以藉由監聽可捲動檢視區塊上的輕觸動作,並呼叫requestFocus()
回應來執行。
自訂旋轉行為
如果可捲動檢視畫面的原生支援,不包括旋轉輸入捲動功能,或是您想使用旋轉輸入項目執行捲動以外的操作 (例如放大/縮小或轉盤),您可以自行操控捲動事件。務必確保您的檢視畫面取得聚焦,否則事件無法順利執行。
下列程式碼片段說明如何使用 MotionEvent
、InputDeviceCompat
和 ViewConfigurationCompat
,在檢視畫面中新增自訂捲動功能:
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 檔案拖曳至模擬器上安裝。
如何在模擬器上測試旋轉輸入功能:
- 在 SDK Manager 中,透過「SDK tools」分頁取得 Android Emulator 26.0.3 以上版本。
- 在 Android Studio 中,依序選取「Tools」>「Android」>「AVD Manager」。使用 API 25 以上版本建立新的 Wear 裝置。
- 從 Android Studio 執行模擬器。
- 按一下模擬器工具列底部的三點溢位選單。在新視窗中按一下「Rotary input」分頁標籤,即可開啟旋轉輸入介面,試用旋轉輸入捲動功能。
以下影片展示模擬器中的旋轉輸入功能: