lightbulb_outline Please take our October 2018 developer survey. Start survey

创建交互式表盘

您的手表显示屏不只是一个漂亮的表盘:用户可以与它交互。例如,用户可以点按表盘了解正在播放哪首歌曲,或者查看当天的议程。只要没有另外一个界面元素也响应同一个单次点按手势,Android Wear 就允许 Android Wear 表盘在特定位置接受这个手势。

本课将向您展示如何通过首先构建表盘样式,然后实现手势处理来实现交互式表盘。

:在您的交互式表盘上开始开发工作之前,您应确保阅读交互式表盘的相关内容。

处理点按 Event

构建交互式表盘样式时,应用必须要做的第一件事是告知系统表盘可以接收点按 Event 。以下示例显示了如何执行此操作:

setWatchFaceStyle(new WatchFaceStyle.Builder(mService)
    .setAcceptsTapEvents(true)
    // other style customizations
    .build());

系统在表盘上检测到点按时,会触发 WatchFaceService.Engine.onTapCommand() 函数。在 WatchFaceService.Engine 实现中替换此函数来发起您想要执行的操作,如显示详细步数或更改表盘的主题背景。处理手势中的代码段展示了此实现的示例。

处理手势

为了提供一致的用户体验,系统会为系统界面元素保留一些手势,如拖动和长按。因此,系统不会向表盘发送原始触摸 Event。不过,系统会向 onTapCommand() 函数转发特定命令。

在用户最初触摸屏幕时,系统会发送第一条命令,即 TAP_TYPE_TOUCH。此 event 让您可以在用户触摸时向用户提供视觉反馈。在此 event 触发时,您的应用不应启动界面。启动界面会阻止拖动 Event 打开应用启动器、设置栏和通知卡片信息流。

在发送下一条命令之前,系统会判断接触是否为单次点按(只允许这一手势)。如果用户立即提起手指,系统会确定发生了单次点按,并转发 <a href="/reference/android/support/wearable/watchface/WatchFaceService.html#TAP_TYPE_TAP" TAP_TYPE_TAP event。如果用户没有立即提起手指,系统会转发 <a href="/reference/android/support/wearable/watchface/WatchFaceService.html#TAP_TYPE_TOUCH_CANCEL" TAP_TYPE_TOUCH_CANCEL event。在用户触发 <a href="/reference/android/support/wearable/watchface/WatchFaceService.html#TAP_TYPE_TOUCH_CANCEL" TAP_TYPE_TOUCH_CANCEL event 后,他们在重新接触屏幕之前无法再触发 <a href="/reference/android/support/wearable/watchface/WatchFaceService.html#TAP_TYPE_TAP" TAP_TYPE_TAP event。

以下示例向您显示了如何在表盘上实现点按 Event:

@Override
public void onTapCommand(
       @TapType int tapType, int x, int y, long eventTime) {
    switch (tapType) {
        case WatchFaceService.TAP_TYPE_TAP:
            hideTapHighlight();
            if (withinTapRegion(x, y)) {
                // Implement the tap action
                // (e.g. show detailed step count)
                onWatchFaceTap();
            }
            break;

        case WatchFaceService.TAP_TYPE_TOUCH:
            if (withinTapRegion(x, y)) {
                // Provide visual feedback of touch event
                startTapHighlight(x, y, eventTime);
            }
            break;

        case WatchFaceService.TAP_TYPE_TOUCH_CANCEL:
            hideTapHighlight();
            break;

        default:
            super.onTapCommand(tapType, x, y, eventTime);
            break;
    }
}

在此示例中,应用会确定发生了哪种 Event,并相应地作出响应。如果 Event 因用户手指首次接触而发生,应用会显示视觉反馈。如果 Event 因用户手指接触后的立即提起而发生,它会在用户点按的位置执行操作。如果 Event 因手指长时间接触而发生,则应用不会执行任何操作。