系列文章《鸿蒙开发从入门到专家》第 28 篇 · 专家
如果说车机是“屏幕大、距离远、安全约束多”,手表就是另一个极端:屏幕小、距离近、电量极其有限。把手机上那一套搬到手表上,用户不是看不清,就是一天三充。
本文聊手表应用开发的三个核心:UI 适配、低功耗设计、以及表盘这个特有形态。
一、Wearable 设备与屏幕适配
手表屏幕通常是圆形或方形,尺寸从 1.5 英寸到 2 英寸不等,像素密度却很高。ArkUI 的响应式布局在手表上依然适用,但要更注重空间利用。
import { display } from '@kit.ArkUI';
const info = display.getDefaultDisplaySync();
const widthVp = px2vp(info.width);
拿到屏幕宽度后,可以判断是否为小屏设备,然后动态调整字号和间距。手表上常见的布局策略:
一屏一个核心操作。
列表项高度 56vp 以上,方便手指点击。
文字字号最小不低于 14fp,关键信息 18fp 以上。
圆形屏幕注意边缘内容被裁切,重要信息放在中心区域。
二、低功耗:手表开发的生命线
手表电池容量小,任何后台行为都要克制。几个关键原则:
减少刷新频率:传感器采样用
SENSOR_DELAY_NORMAL或更慢。按需连接:BLE 连接不用时断开,不要用长连接空跑。
后台任务谨慎使用:手表后台存活策略比手机更严格。
暗色主题优先:AMOLED 屏幕黑色像素不发光,能显著省电。
sensor.on(sensor.SensorId.HEART_RATE, (data) => {
// 心率数据
}, { interval: sensor.SensorInterval.NORMAL });
如果做运动类应用,建议只在用户主动开启运动时高频采样,平时回退到分钟级监测。
三、表盘:手表独有的应用形态
表盘不是普通应用,它是一个特殊的 Ability,生命周期和渲染方式由系统管理。鸿蒙提供 Digital Watch Face 和 Analog Watch Face 两种模板。
表盘开发的核心是:WatchFace Ability + 时间管理 + 传感器数据展示。
import { WatchFace } from '@kit.WearableUiKit';
export default class MyWatchFace extends WatchFace {
onCreate() {
// 初始化表盘
}
onUpdateTime(hour: number, minute: number, second: number) {
// 每秒刷新一次
this.updateCanvas();
}
}
设计表盘时要注意:
AOD(Always On Display):息屏状态下表盘要简化,只用黑白或低饱和度颜色。
complications( complications ):留出系统信息区域,比如电量、步数、天气。
动画节制:动态效果好看但耗电,建议默认关闭或仅在抬腕时播放。
四、健康数据读取
手表最核心的价值之一是健康监测。鸿蒙通过 @kit.HealthServiceKit 提供心率、血氧、睡眠、压力等数据读取能力。
读取心率示例:
import { health } from '@kit.HealthServiceKit';
const request: health.ReadOptions = {
dataType: health.DataType.HEART_RATE,
startTime: Date.now() - 3600 * 1000,
endTime: Date.now(),
};
const result = await health.readData(request);
健康数据属于高敏感权限,需要在 module.json5 中声明,并在首次使用时向用户说明用途。不要频繁读取历史数据,尽量用订阅实时数据或按小时聚合。
五、实战:运动数据表盘
做一个显示步数和心率的表盘:
表盘主体用 Canvas 绘制圆形进度环。
中心显示当前时间。
底部小字显示今日步数,订阅
SensorId.PEDOMETER或读取 Health Kit。运动时心率区域高亮,AOD 模式下隐藏彩色元素。
每小时聚合一次步数,写入本地缓存,避免频繁查询健康服务。
小结
手表开发的核心矛盾是“体验”与“续航”。记住几个要点:
UI 按小屏和圆形屏幕重新设计,不要直接缩放手机界面。
传感器、网络、后台任务全部按最低可用频率运行。
表盘要区分亮屏和息屏状态,AOD 必须极简。
健康数据读取要有明确用户授权和最小必要原则。
下一篇我们聊聊 IoT 设备互联,看看鸿蒙的分布式软总线怎么把手机和智能家居串起来。