起因:我想知道"自己还剩多少电"
去年年底有段时间状态特别差。不是生病,也不是熬夜,就是每天下午三点开始脑子像灌了浆糊。番茄钟试过,情绪日记试过,习惯打卡也试过,发现都不对——我想知道的不是"今天心情好不好",而是"我的电还剩多少"。
精力这个东西,本质上就是一块电池:有些事在充电,有些事在耗电,你需要知道实时余额。想清楚这一点之后我就开始动手了,做了一个叫「元气手账」的 App,跑在 HarmonyOS 上。这篇文章聊聊设计思路、技术选型和两个月的上架数据。
为什么选 HarmonyOS
坦白说,一开始是奔着鸿蒙生态的流量红利去的。但真正上手 ArkUI 之后发现,声明式 UI 写这种卡片式交互确实舒服。元气手账的核心页面就是一块"电池",充能事件往上加,耗能事件往下减,ArkTS 的状态管理天然适合这种数值驱动的界面刷新。
另一个决定性因素是鸿蒙的卡片服务(FormKit)。精力记录最怕"打开 App 太重",我希望用户在桌面上看一眼卡片就知道当前余额,点一下胶囊就完成一次打卡。这个体验在 HarmonyOS 上几乎是原生支持的,不需要额外绕弯路。
核心设计:电量隐喻 + 胶囊打卡
交互逻辑很简单:你的一天从 100% 电量开始(或者你自定义的起始值),每记一笔就加减相应的数值。
充能事件举例:午睡 20 分钟 → +15%,散步 → +10%,和朋友聊天 → +8%。耗能事件举例:连续会议 2 小时 → -25%,刷短视频 40 分钟 → -12%,通勤堵车 → -8%。
我预设了 30 多个常见场景做成"胶囊"按钮,点一下就记完了,整个过程不超过 3 秒。这一点我觉得比大多数习惯打卡 App 好用太多——那些 App 总要你填时间、选标签、写备注,而精力记录这件事就该像扫一眼手表一样轻。
技术实现:状态驱动的电量条动画
电池动画这块,我用了 ArkUI 的 @State 配合 animateTo 做电量条的实时变化。核心逻辑如下:
@Entry
@Component
struct BatteryView {
@State currentLevel: number = 100
addEnergy(value: number) {
animateTo({ duration: 300, curve: Curve.EaseOut }, () => {
this.currentLevel = Math.min(100, this.currentLevel + value)
})
}
drainEnergy(value: number) {
animateTo({ duration: 300, curve: Curve.EaseOut }, () => {
this.currentLevel = Math.max(0, this.currentLevel - value)
})
}
}
这段代码的核心思路是把电量值作为唯一状态源,所有 UI 表现(电池条宽度、颜色、动画)都从这个 currentLevel 派生。animateTo 包裹状态变更,ArkUI 会自动对绑定了该状态的属性做插值动画,不需要手动管理帧。
一个小细节:电量低于 20% 时电池会变红并轻微抖动。这个功能实现成本很低,但好几个内测用户反馈说"看到红色就知道该休息了",算是投入产出比最高的一个交互设计。
数据洞察:"精力吸血鬼"和"精力绿洲"
用了一周之后数据就开始有意思了。我做了一个"TOP 洞察"功能:系统自动统计哪些事件是你的"精力吸血鬼"(累计耗电最多),哪些是"精力绿洲"(充电效率最高)。
我自己跑了两周数据,发现了一件反直觉的事:午睡的充能效果远不如"出门买杯咖啡"。后来想想也对,午睡经常睡过头反而更累,而买咖啡那 10 分钟走路加换环境才是真正在充电。
数据聚合这块用了鸿蒙的关系型数据库 @ohos.data.relationalStore,按事件类型做 GROUP BY 统计,周维度和月维度各出一张排行卡片。这部分逻辑不复杂,主要是把查询结果映射到可视化卡片的渲染上需要注意性能——事件类型多了之后排序和截断策略要提前想好。
两个月上架数据
元气手账在今年 3 月底通过华为应用市场审核上架,到现在差不多两个月,分享几个数字:
下载量突破 4200,日活稳定在 380 左右。用户平均每天记录 5.3 笔,说明胶囊打卡的设计确实降低了记录门槛。好评里被提到最多的关键词是"直觉"和"快",差评集中在"想要更多自定义场景"——这个已经在做了。
比较意外的是,考研群体占了将近三成。有个用户私信我说他用这个来监控自己的"学习续航",学到电量低于 30% 就强制休息,效率比硬撑着高很多。这个使用方式是我没预料到的,也让我重新思考了目标用户的画像。
接下来的计划
正在适配 HarmonyOS NEXT 的纯血版本,准备接入 ArkData 做跨设备数据同步——比如手表上快速打卡,手机上看详细报表。另外在考虑加入"充电建议",当系统检测到你连续耗电事件超过 3 笔时,主动推荐你预设的充能方式。
写在最后
做这个 App 两个月,最大的体会是:工具型产品的核心竞争力不在功能多,在于"记录这个动作本身够不够轻"。3 秒完成一次打卡这个指标,决定了用户到底会坚持用三天还是三个月。
如果你也在做鸿蒙开发,或者对精力管理这个方向感兴趣,评论区聊聊。我踩过的坑不少,尤其是 FormKit 卡片刷新频率限制和 ArkUI 自定义绘制的性能问题,有机会单独写一篇展开说。华为应用市场搜索「元气手账」就能找到。