Android NDK开发详解Wear之旋转输入

Android NDK开发详解Wear之旋转输入


某些 Wear OS 设备包含实体侧面旋钮。当用户旋转此类旋钮时,应用的当前视图会向上或向下滚动。此类输入称为“旋转输入”。

注意:本指南主要介绍了如何使用基于 View 的界面处理旋转输入。如需详细了解如何使用 Compose for Wear OS 处理旋转输入,请参阅 Compose 中的旋转输入。

许多可滚动容器(如 ScrollView、ListView、HorizontalScrollView 和 WearableRecyclerView)都支持旋转输入,而且无需任何 Wear OS 专用代码,前提是这些容器拥有焦点。拥有焦点是一个重要的前提条件,因为在 Android 9(API 级别 28)及更高版本中,视图不会隐式接收焦点。

焦点最佳实践

如需响应旋转输入事件,可滚动容器必须拥有焦点。旋转输入事件不会在视图层次结构中向上传递。如果没有聚焦视图,或者聚焦的视图从 View.onGenericMotionEvent() 返回 false,则系统会将事件发送到 Activity.onGenericMotionEvent()。

下面列出了响应旋转输入事件的最佳实践:

请注意,默认情况下,启动 activity 甚至是点按某个视图,都不会使其聚焦,即使视图可聚焦也是如此。如需聚焦视图,视图必须使用 标记或手动调用 View.requestFocus()。
同时使用 android:focusable=“true” 和 android:focusableInTouchMode=“true” 将自定义可滚动视图标记为可聚焦。
如果您的可滚动视图是在 Activity.onCreate() 之后附加的,例如在构建界面之前等待网络请求完成,请在附加该视图之后调用 requestFocus()。
如果您的可滚动视图最初为 INVISIBLE 或 GONE,请在将其设置为 VISIBLE 时调用 requestFocus()。
如果您的 activity 包含多个可滚动视图,请通过 标记选择一个要聚焦的视图。侧面旋钮不支持嵌套滚动。
如果您的界面中有某种其他视图会在用户与之交互时获得焦点(例如 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() {
  
  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 中,依次选择 Tools > Android > AVD Manager。创建一个新的 Wear 设备,并将其 API 级别设为 25 或更高。
在 Android Studio 中运行模拟器。
点击模拟器工具栏底部的三点状溢出菜单。点击新窗口中的 Rotary input 标签页以打开旋转输入界面,然后尝试进行旋转输入滚动。
以下视频展示了模拟器中的旋转输入。

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2023-11-22。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值