用户可以通过多种方式与您的表盘互动。例如,用户可以点按表盘,了解当前正在播放的歌曲或查看当天的日程。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; } }
在此示例中,应用会确定发生了哪种事件,并相应地做出响应。如果该事件是用户手指的初次接触,则应用会显示视觉反馈。如果该事件是手指在接触后立即抬起,则它会执行用户点按的操作。如果该事件是手指的长时间接触,该应用不会执行任何操作。