创建互动式表盘主题

用户可以通过多种方式与您的表盘主题互动。例如,用户可以点按表盘主题以了解当前正在播放的歌曲,或查看当天的日程。Wear OS by Google 谷歌允许表盘主题在表盘主题上的给定位置接受单次点按手势,只要没有其他界面元素也会响应该手势即可。

本课教您如何实现互动式表盘主题,即首先构建表盘主题样式,然后实现手势处理。

注意:在开始进行互动式表盘主题的开发工作之前,请务必阅读互动式表盘主题一文。

处理点按事件

在构建互动式表盘主题样式时,应用必须首先告知系统表盘主题会接收点按事件。以下示例展示了如何执行此操作:

Kotlin

    setWatchFaceStyle(WatchFaceStyle.Builder(service)
            .setAcceptsTapEvents(true)
            // other style customizations
            .build())
    

Java

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

当系统检测到用户点按表盘主题时,会触发 WatchFaceService.Engine.onTapCommand() 方法。您可以在 WatchFaceService.Engine 实现中替换此方法以启动您希望执行的操作,如显示详细步数或更改表盘主题的主题背景。处理手势中的代码段展示了此类实现的一个示例。

处理手势

为了提供一致的用户体验,系统会为系统界面元素保留相关手势(如拖动和长按)。因此,系统不会向表盘主题发送原始触摸事件。但是,系统会将特定命令转发给 onTapCommand() 方法。

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

在发送下一个命令之前,系统会判断相应接触是否为单次点按(只允许这一手势)。如果用户立即抬起手指,系统会确定执行了单次点按操作,并转发 TAP_TYPE_TAP 事件。如果用户没有立即抬起手指,则系统会转发 TAP_TYPE_TOUCH_CANCEL 事件。一旦用户触发了 TAP_TYPE_TOUCH_CANCEL 事件,他们便无法触发 TAP_TYPE_TAP 事件,直到他们再次与屏幕接触。

以下示例向您展示了如何在表盘主题上实现点按事件:

Kotlin

    override fun onTapCommand(@TapType tapType: Int, x: Int, y: Int, eventTime: Long) {
        when (tapType) {
            WatchFaceService.TAP_TYPE_TAP -> {
                hideTapHighlight()
                if (withinTapRegion(x, y)) {
                    // Implement the tap action
                    // (e.g. show detailed step count)
                    onWatchFaceTap()
                }
            }

            WatchFaceService.TAP_TYPE_TOUCH ->
                if (withinTapRegion(x, y)) {
                    // Provide visual feedback of touch event
                    startTapHighlight(x, y, eventTime)
                }

            WatchFaceService.TAP_TYPE_TOUCH_CANCEL -> hideTapHighlight()

            else -> super.onTapCommand(tapType, x, y, eventTime)
        }
    }
    

Java

    @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;
        }
    }
    

在此示例中,应用会确定发生了哪种事件,并相应地做出响应。如果该事件是用户手指的初次接触,则应用会显示视觉反馈。如果该事件是手指在接触后立即抬起,则它会执行用户点按的操作。如果该事件是手指的长时间接触,则该应用不会执行任何操作。