我的 Garmin 表盘

23年的双十一换了 Garmin 的 Forerunner265S
购买原因:
1. 可以不带手机跑步和听音乐
2. 待机时间长
3. 显得专业
想换《辐射》主题很久了…… 有看到喜欢的又没办法海外付款,最近试试用AI写了一个主题,目前还是比较满意的
Pip-Boy 3000 表盘 - Garmin Forerunner 265s
辐射(Fallout)系列游戏启发的Pip-Boy主题表盘,专为Garmin Forerunner 265s设计,采用标志性的绿色单色复古未来主义美学。
功能特性
- 复古Pip-Boy设计:经典绿色单色配色方案 (#00FF00)
- CRT屏幕效果:真实的扫描线叠加,呈现复古终端外观
- 全面的数据显示:
- 时间(时:分,带秒数)
- 日期(日、月、年)
- 步数计数器
- 心率监测
- 电池百分比
- 消耗卡路里
- 避难所男孩角色:标志性的辐射吉祥物
- Pip-Boy边框:带角落支架的技术边框
安装说明
前置要求
-
安装 Connect IQ SDK Manager
- 下载地址:https://developer.garmin.com/connect-iq/sdk/
- 使用Garmin Connect账户登录
-
安装 Visual Studio Code
-
安装 Monkey C 扩展
- 打开 VS Code
- 进入扩展 (Cmd+Shift+X)
- 搜索 “Monkey C”
- 安装官方Garmin扩展
- 生成开发者密钥(如果还没有)
openssl genrsa -out developer_key.pem 4096 openssl pkcs8 -topk8 -inform PEM -outform DER -in developer_key.pem -out developer_key.der -nocrypt
构建表盘
-
使用 Visual Studio Code(推荐):
- 在VS Code中打开此项目文件夹
- 按
Ctrl+Shift+P(Mac上为Cmd+Shift+P) - 输入 “Monkey C: Build for Device”
- 选择 “fr265s” (Forerunner 265s)
.prg文件将在bin文件夹中生成
-
使用命令行:
# 确保 monkeyc 编译器在你的 PATH 中 # -o: 输出文件 # -f: Jungle 配置文件 # -y: 开发者密钥 # -d: 目标设备 (fr265s) # -w: 显示警告 monkeyc -o bin/garmin.prg -f monkey.jungle -y developer_key.der -d fr265s -w
在模拟器中测试
-
使用 VS Code:
- 按
Ctrl+Shift+P(Mac上为Cmd+Shift+P) - 输入 “Monkey C: Run”
- 选择 “fr265s”
- 按
-
使用命令行(推荐):
第一步:启动模拟器 在新的终端窗口中运行(需保持运行状态):
# 启动 Connect IQ 模拟器 connectiq第二步:编译并推送 在项目根目录下运行:
# 1. 编译项目 (生成 PRG 文件) # 注意:请确保替换为你实际的 SDK路径 和 开发者密钥路径 monkeyc -o bin/garmin.prg -f monkey.jungle -y developer_key.der -d fr265s -w # 2. 推送到模拟器 monkeydo bin/garmin.prg fr265s提示: 如果
monkeyc命令未找到,主要需要在 PATH 中添加 SDK 的bin目录。 Mac 默认路径通常为:~/Library/Application Support/Garmin/ConnectIQ/Sdks/connectiq-sdk-mac-x.x.x/bin
安装到手表
-
通过 Garmin Express(电脑):
- 将Forerunner 265s连接到电脑
- 打开Garmin Express
- 将
.prg文件复制到手表的GARMIN/APPS文件夹
-
通过 Connect IQ 手机应用:
- 在VS Code中将项目导出为
.iq文件 - 传输到手机
- 使用Connect IQ应用安装到手表
- 在VS Code中将项目导出为
项目结构
gamini/
├── manifest.xml # 应用清单和设备配置
├── monkey.jungle # 构建配置
├── source/
│ ├── PipBoyWatchFaceApp.mc # 主应用入口点
│ └── PipBoyWatchFaceView.mc # 表盘视图和渲染逻辑
└── resources/
├── strings/
│ └── strings.xml # 本地化字符串
├── layouts/
│ └── layout.xml # UI布局定义
└── drawables/
├── drawables.xml # 可绘制资源定义
├── launcher_icon.png # 应用启动图标
├── vault_boy_walk1.png # 走路动画1
├── vault_boy_walk2.png # 走路动画2
└── vault_boy.png # 避难所男孩待机精灵图
自定义
更改颜色
编辑 PipBoyWatchFaceView.mc 并修改这些变量:
var pipboyGreen = 0x00FF00; // 主Pip-Boy绿色
var backgroundColor = 0x000000; // 黑色背景
var darkGreen = 0x006600; // 扫描线颜色
调整数据字段
修改 PipBoyWatchFaceView.mc 中的 drawStats() 函数来更改显示的健身指标或它们的位置。
动画
可以通过修改 drawVaultBoy() 函数来增强避难所男孩角色的动画效果,根据不同状态(心率区间、活动水平等)使用精灵图像。
技术细节
- 目标设备:Garmin Forerunner 265s(416x416 AMOLED显示屏)
- 最低API级别:3.2.0
- 语言:Monkey C
- 权限:SensorHistory, UserProfile
致谢
- 灵感来自辐射游戏系列的Pip-Boy界面
- 为Garmin Connect IQ平台创建
- 避难所男孩角色 © Bethesda Softworks
许可
这是一个粉丝制作的表盘,仅供个人使用。
支持
有关Garmin Connect IQ开发的问题:
- 官方文档:https://developer.garmin.com/connect-iq/
- 开发者论坛:https://forums.garmin.com/developer/
一些修改过程
添加唤醒走路动画
添加了一个手表唤醒之后行走的动画
会在 drawables.xml 文件制定图片资源
<?xml version="1.0"?>
<resources>
<bitmap id="LauncherIcon" filename="launcher_icon.png" />
<bitmap id="VaultBoy" filename="vault_boy.png" />
<bitmap id="VaultBoyWalk1" filename="vault_boy_walk1.png" />
<bitmap id="VaultBoyWalk2" filename="vault_boy_walk2.png" />
</resources>
在 PipBoyWatchFaceView.mc 中定义动画
// --- Center: Vault Boy ---
var bmpToDraw = vaultBoyBitmap;
if (isAwake && vaultBoyWalk1Bitmap != null && vaultBoyWalk2Bitmap != null) {
var nowMs = System.getTimer();
// Play animation for 2 seconds
if (nowMs - animStartTime < ANIM_DURATION) {
// Cycle every 250ms (Walking speed)
// 3 Frames: 0=Stand, 1=Walk1, 2=Walk2
var frame = (nowMs / 250) % 3;
if (frame == 1) {
bmpToDraw = vaultBoyWalk1Bitmap;
} else if (frame == 2) {
bmpToDraw = vaultBoyWalk2Bitmap;
}
}
}
动画效果

字体
字体使用了谷歌的开源字体:(Share Tech Mono)[https://fonts.google.com/specimen/Share+Tech+Mono]
从AI写的工程来看,会提取使用的字符形成 fnt 格式的文档

还优化了一些字符的显示, 比如步数超过9999会溢出,当步数超过此数值时,会切换成千分位 10.0k 显示
时间符号 “:” 全字符很占小屏幕的位置,把小时和分钟布置成上下排列,减少占位
目前看还是比较满意的 AI Coding 上大分!