给自己做一个 Garmin 表盘

这个天意表盘其实已经做好很久了,但一直没时间去优化,所以也很久没有开始写笔记。现在还存在的问题主要是(1) stroke 的图层在渲染的时候是没问题的,但是加载到我的手表上时候,秒针的图层会叠在中心圆点上,导致效果不美观;(2)只兼容支持彩显的手表。
一开始做的时候傻傻地手搓了半天指针式,效果总是不好,直到我发现 SDK 文件夹的 sample/Analog 里有指针式的模板,只要在此基础上稍作修改即可……
再加上 Garmin 官方的 Monkey C 教程 和 API Docs, 似乎没有什么需要特别说的。
值得注意的是,表盘坐标轴的原点是左上角,x 轴的方向是从左到右递增,y 轴的方向是从上到下递增。在给手表加 Hashmark 和数字的时候,用作坐标的不是该元素的中心点而是最低点,所以我写了这么丑陋的东西出来:
for (var i = 1; i <= 12; i++) {
var angleDeg = (i % 12) * 30;
var rad = angleDeg * Math.PI / 180.0;
var radius=(width < height ? width : height) / 2 * 0.82;
var x = width/2 + radius * Math.sin(rad);
var y = height/2 - radius * Math.cos(rad) -32 ;
有朋友可能注意到了,我用了霞鹜文楷和 JetBrains Mono 作为中文和英数的字体。这部分我参考了这篇文章:How I wrote a watch face for my Garmin Fēnix 8+, FNT 格式的字体基本上就是把要的字全部摘出来转化为 PNG 格式,然后以 FNT 文件指示每个字分别在图片的什么地方,方便调用。在将 TTF 转化为 FNT 的时候需要用到 BMFont。BMFont 的教程网络上也有很多,此处就不再赘述了。有一点需要注意,Latin + Latin Supplement 的部分不需要想太多,直接全部勾上就可以;中文字符则比较麻烦,通常的做法是先创建一个文本文件,输入所有你需要的字符(比如我的是骄败哀胜兵必),以 UTF-8 with BOM 的格式保存后导入到 BMFont 中。在很多教程中建议的是 UTF-8,但我测试之后发现会乱码,如果你遇到差不多的问题,就在这两个格式之间来回切换,看哪个可用。
Comments on Giscus
Comments on Mailing List
Don't feel like using GitHub? Don't worry, we have a mailing list hosted on SourceHut. Just send an email to ~yuki/obsp-inbox@lists.sr.ht to join the discussion!
Comments on Fediverse
With an account on the Fediverse, you can respond to this post. Since ActivityPub is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one. Known non-private replies are displayed below.
Learn how this is implemented here.