旋转输入

一些 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 管理器中,使用SDK 工具选项卡获取 Android 模拟器 26.0.3 或更高版本。
  2. 在 Android Studio 中,选择工具 > Android > AVD 管理器使用 API 25 或更高版本创建新的 Wear 设备
  3. 从 Android Studio 运行模拟器.
  4. 点击模拟器工具栏底部的三点溢出菜单。点击新窗口中的旋转输入选项卡以打开旋转输入界面并尝试旋转输入滚动。

以下视频显示了模拟器中的旋转输入