使用手腕手势

在您不方便触摸屏幕时,可通过手腕手势快速地与应用进行单手交互。

例如,用户可以用一只手滚动浏览通知,用另一只手端水杯。可体现手腕手势用处的示例还包括:

  • 在一个慢跑应用中,浏览显示所走步数、经过的时间以及当前步速的垂直屏幕
  • 携带行李在机场时,滚动浏览航班和登机口信息
  • 滚动浏览新文章

要查看手表上的手腕手势,请通过选择 Settings > Gestures > Wrist Gestures On 确认手势已启用。然后,在手表上完成手势教程 (Settings > Gestures > Launch Tutorial)。

应用无法使用 Android Wear 帮助中的以下手势:

  • 晃动手腕

可通过以下方式使用手腕手势:

每个手腕手势将被映射到 KeyEvent 类中的一个 int 常量,如下表所示:

手势 KeyEvent 说明
手腕外翻 KEYCODE_NAVIGATE_NEXT 此键代码可转到下一个项目。
手腕内翻 KEYCODE_NAVIGATE_PREVIOUS 此键代码可转到上一个项目。

使用曲线布局以支持手腕手势

WearableRecyclerView 类为列表提供一个曲线布局,并自动支持手腕手势。当视图具有焦点时,此类具有触发手腕手势的预定义操作。如需了解有关使用 WearableRecyclerView 类的信息,请参阅创建列表。另请参阅最佳做法

:在穿戴式设备支持库中, WearableRecyclerView 类取代了一个与其类似且已弃用的类。

即使您使用一个 WearableRecyclerView,您可能也希望使用 KeyEvent 类中的常量。可通过创建 WearableRecyclerView 的子类和重新实现 onKeyDown() 回调来重写预定义的操作。此行为可通过使用 setEnableGestureNavigation(false) 完全停用。另请参阅处理键盘操作

直接使用按键 Event

您可以使用 WearableRecyclerView 之外的按键 Event 触发新操作以响应手势 Event。重要的是,这些手势 Event 具有如下特点:

  • 当设备处于活动模式时可识别
  • 传递方式与所有按键 Event 相同

具体而言,这些 Event 将传递到顶部 Activity,传递到具有键盘焦点的视图。与任何其他按键 Event 一样,与实现 KeyEvent.Callback 的用户交互(如视图或 Activity)相关的类可侦听与手腕手势相关的按键 Event。Android 框架使用按键 Event 调用具有焦点的视图或 Activity;对于手势,在做出手势时调用 onKeyDown() 函数。

例如,应用可能重写视图或 Activity(都可实现 KeyEvent.Callback)中的预定义操作,如下所示:

public final class GesturesActivity extends Activity {

 @Override /* KeyEvent.Callback */
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  switch (keyCode) {
   case KeyEvent.KEYCODE_NAVIGATE_NEXT:
    // Do something that advances a user View to the next item in an ordered list.
    return moveToNextItem();
   case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
    // Do something that advances a user View to the previous item in an ordered list.
    return moveToPreviousItem();
  }
  // If you did not handle it, let it be handled by the next possible element as deemed by the Activity.
  return super.onKeyDown(keyCode, event);
 }

 /** Shows the next item in the custom list. */
 private boolean moveToNextItem() {
  boolean handled = false;
  …
  // Return true if handled successfully, otherwise return false.
  return handled;
 }

 /** Shows the previous item in the custom list. */
 private boolean moveToPreviousItem() {
  boolean handled = false;
  …
  // Return true if handled successfully, otherwise return false.
  return handled;
 }
}

最佳做法

  • 查阅 KeyEvent KeyEvent.Callback 页面以将按键 Event 传递到您的视图和 Activity。
  • 保持一致的方向功能可见性:
    • 使用“手腕外翻“可浏览下一个项目,使用“手腕内翻”可返回上一个项目
  • 为手势提供并行触摸。
  • 提供视觉反馈。
  • 请勿使用键代码实现与其余系统直觉相反的功能。例如,请勿使用 KEYCODE_NAVIGATE_NEXT 取消操作,或使用翻动姿势导航左-右轴
  • 请勿拦截不属于界面的元素的按键 Event,例如,在屏幕之外或部分被遮盖的视图。这同样适用于任何其他的按键 Event。
  • 请勿将重复的翻动手势重新解释为您自己的新手势。它可能与系统的“晃动手腕”手势冲突。
  • 对于接收手势键 Event 的视图,它必须具有焦点;请参阅 View::setFocusable()。由于手势被视为按键 Event,因此,它们会触发一个“触摸模式”以外的转换,这可能会引发意外。又因为用户可能会交替使用触摸和手势,所以,可能需要 View::setFocusableInTouchmode() 函数。在某些情况下,可能还需要它才能使用 setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS),以便在切换“触摸模式”后焦点发生变化时,您的目标视图可获得焦点。
  • 谨慎使用 requestFocus()clearFocus()
    • 调用 requestFocus() 时,请确保视图确实具有焦点。如果此视图在屏幕之外或被另一个视图覆盖,当手势触发回调时会出现意外。
    • clearFocus() 将发起焦点搜索以查找另一个适合的视图。根据视图层次结构,此搜索可能需要比较复杂的计算。最后,它还会将焦点分配给您不希望它收到焦点的视图。
  • 在视图层次结构中,首先将按键 Event 传递到具有焦点的视图。如果焦点视图不处理此 Event(例如,返回 false),则系统不会将此 Event 传递到父视图,即使它能够收到焦点并具有一个 KeyListener。而是将此 Event 传递到具有视图层次结构和焦点的当前 Activity。因而,它可能需要捕捉位于较高级别的所有 Event,然后将相关代码向下传递。或者,您可能会创建 Activity 的子类并重写 dispatchKeyEvent(KeyEvent event) 函数,以确保在必要时拦截这些键,或在较低层无法处理时处理它们。