lightbulb_outline Please take our October 2018 developer survey. Start survey

旋转输入

某些 Android Wear 设备支持旋转输入,如侧面旋钮 (RSB)。当用户扭动旋钮时,您的应用的当前视图应向上或向下滚动。

如果您在应用中使用 ScrollViewListViewHorizontalScrollViewWearableRecyclerView,那么,默认情况下,您的应用视图将获得旋转输入支持。如果您使用上述视图以外的自定义视图,或者您希望手动处理旋转输入 Event,请参阅添加自定义旋转输入滚动

聚焦最佳做法

为响应旋转输入 Event,您的滚动视图必须位于焦点中。大多数情况下,系统会自动聚焦;在创建 Activity 后,您的滚动视图将立即成为焦点。不过,在有些情况下,您需要手动处理应用视图的聚焦,例如:

  • 如果您的可滚动视图附加在 Activity.onCreate() 之后(例如,您在构建界面前等待网络请求完成),那么,在附加该视图后必须调用 requestFocus
  • 如果可滚动视图最初为 INVISIBLEGONE,在将它设置为 VISIBLE 时您必须调用 requestFocus
  • 如果您的 Activity 包含多个可滚动视图(例如,如果您使用嵌套滚动),那么,您需要从中选择一个视图作为焦点(通常通过 <requestFocus /> 标记)。RSB 滚动目前不支持嵌套滚动。
  • 如果您的界面包含一些在用户与它交互时会侵占焦点的其他视图(这种情况很罕见;最常见的示例为 InputText),您需要为用户提供一些方式以便在丢失焦点时将焦点恢复到可滚动视图。这通常通过侦听可滚动视图上的点按和调用响应中的 requestFocus 来完成。

添加自定义旋转输入滚动

如果您的可滚动视图不能为旋转输入滚动提供原生支持,或者您想执行滚动以外的其他一些操作以响应旋转输入 Event(放大/缩小、旋转表盘等),您可以使用穿戴式设备支持库中的 RotaryEncoder 函数。

以下代码段演示如何使用 RotaryEncoder 以在应用视图中添加自定义滚动:

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
    @Override
    public boolean onGenericMotion(View v, MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
            // Don't forget the negation here
            float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(
            getContext());

            // Swap these axes if you want to do horizontal scrolling instead
            scrollBy(0, Math.round(delta));

            return true;
        }

        return false;
    }
});

在模拟器上测试旋转输入按钮

您可以使用 Android Emulator 模拟 Wear 设备上的旋转输入滚动。您可以在运行项目时在模拟器上启动 Wear 应用,也可以将 APK 文件拖动到模拟器上,安装应用。

要在模拟器上测试旋转输入,请执行以下操作:

  1. Canary 发布渠道获取最新的 Wear 模拟器 26.0.1 系统映像。
  2. SDK 管理器中,使用 SDK tools 标签获取 Android Emulator 的最新版本。
  3. 创建包含 API 25 的 AVD (Android Virtual Device)。

    在 Studio 中,选择 Tools>Android>AVD Manager创建包含 API 25 的新 Wear 设备

  4. 从 Android Studio 运行模拟器
  5. 尝试旋转输入滚动。

    点击溢出按钮(模拟器工具栏底部的三个点)。点击新窗口中的 Rotary input 标签以打开旋转输入界面。

有关旋转输入在模拟器上的工作方式的概览,请观看以下视频。

聚焦行为温馨提示

  • 如果视图具有 setFocusableInTouchMode(true),则该视图可聚焦。默认情况下,这仅适用于可滚动视图(例如,ScrollView)和 InputText
  • 默认情况下,点按视图不会使其成为焦点(即使该视图可聚焦)。要实现此行为,视图必须侦听点按 Event,并手动调用 View.requestFocus()
  • Activity 创建后,它将立即自动聚焦在其视图层次结构中找到的第一个可聚焦视图。如果您的 Activity 中具有多个可聚焦视图,则该视图可能不是您所需要的视图。您可以使用 <requestFocus /> 标记(或通过手动调用 Activity.onResume 中的 View.requestFocus)聚焦另一个视图。
  • 在创建 Activity 后,如果可聚焦视图是附加的或处于隐藏状态,则它不会自动聚焦,即使当前没有聚焦视图也是如此。在此情况下,您需要手动调用 View.requestFocus
  • 旋转输入 Event 只能被发送到焦点视图。这些 Event 不会触发视图层次结构。如果没有焦点视图,或焦点视图从 View.onGenericMotionEvent 返回 false,此时(且只有在这时)该 Event 将被发送到 Activity.onGenericMotionEvent