在您不方便触摸屏幕时,可通过手腕手势快速地与应用进行单手交互。
例如,用户可以用一只手滚动浏览通知,用另一只手端水杯。可体现手腕手势用处的示例还包括:
- 在一个慢跑应用中,浏览显示所走步数、经过的时间以及当前步速的垂直屏幕
- 携带行李在机场时,滚动浏览航班和登机口信息
- 滚动浏览新文章
要查看手表上的手腕手势,请通过选择 Settings > Gestures > Wrist Gestures On 确认手势已启用。然后,在手表上完成手势教程 (Settings > Gestures > Launch Tutorial)。
应用无法使用 Android Wear 帮助中的以下手势:
- 晃动手腕
可通过以下方式使用手腕手势:
- 使用一个曲线布局,其具有预定义的手势操作
- 直接使用按键 Event 以定义新的用户操作
每个手腕手势将被映射到 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)
函数,以确保在必要时拦截这些键,或在较低层无法处理时处理它们。