一些 Wear OS 设备包含一个物理的 *旋转侧按钮*。当用户转动按钮时,它会向上或向下滚动应用的当前视图。这种类型的输入称为 *旋转输入*。
**注意:** 本指南主要介绍如何使用基于视图的 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 管理器 中,使用“SDK 工具”选项卡获取 Android 模拟器 26.0.3 或更高版本。
- 在 Android Studio 中,选择“工具 > Android > AVD 管理器”。创建一个新的 Wear 设备,API 级别为 25 或更高。
- 从 Android Studio 运行模拟器.
- 点击模拟器工具栏底部的三点溢出菜单。在新的窗口中点击“旋转输入”选项卡打开旋转输入界面,并尝试旋转输入滚动。
以下视频展示了模拟器中的旋转输入