收紧常亮模式:去掉进度环,时间日期压暗到 38%

按要求把常亮再砍一档。常亮下现在不画:整条日期带底色、整个进度环、
四个数据位与电池;保留的时间、冒号、日期由 55% 压暗到 38%。

实测(fenix847mm,取表盘内区):

                  点亮像素数    平均亮度(功耗代理)
    普通模式         27.6%          14.1%
    常亮(改前)      10.4%           3.0%
    常亮(改后)       9.7%           2.5%

两个口径的差别值得记一笔:「点亮像素数」把每个抗锯齿边缘像素都算成亮的,
对大号数字表盘天然不友好 —— 时间数字压到 38% 后白色仍有 ~97 亮度,照样计入。
AMOLED 的实际功耗更接近各子像素亮度之和,也就是「平均亮度」那一列。
两个口径现在都留了余量,38% 下时间和日期在模拟器里依然清晰可读。

LICENSE、UserProfile 的 try 保护、CHANGELOG 与版本号 1.1.0 已在上一个提交
22340b0 完成,本次只动常亮相关部分与对应文档。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 11:37:58 +08:00
parent 22340b09fa
commit 696b728c78
3 changed files with 20 additions and 41 deletions

View File

@@ -11,6 +11,11 @@ Approach S50/S70、Descent G2/Mk3、D2 系列、Instinct 3 AMOLED、FR255S/265S/
新增两档图标尺寸218px、360px。218px 上设计稿的天气图标只有 14×14 新增两档图标尺寸218px、360px。218px 上设计稿的天气图标只有 14×14
太阳与云之间的暗缝不足一个像素,会糊成一块 —— 该尺寸改用专画的简化标记。 太阳与云之间的暗缝不足一个像素,会糊成一块 —— 该尺寸改用专画的简化标记。
**常亮模式收紧**
砍掉整个进度环,时间/日期由 55% 压暗到 38%。实测点亮像素数 10.4% → 9.7%
平均亮度 3.0% → 2.5%(普通模式分别是 27.6% / 14.1%)。
**其它** **其它**
- 补 LICENSEMIT仅覆盖代码`design/` 下的设计稿版权归第三方,见文件内说明) - 补 LICENSEMIT仅覆盖代码`design/` 下的设计稿版权归第三方,见文件内说明)

View File

@@ -295,11 +295,11 @@ AMOLED 机型在常亮模式下必须压低点亮像素,否则既费电又有
| | 点亮像素数 | 平均亮度(功耗代理) | | | 点亮像素数 | 平均亮度(功耗代理) |
|---|---|---| |---|---|---|
| 普通模式 | 27.6% | 14.1% | | 普通模式 | 27.6% | 14.1% |
| 常亮模式 | 10.4% | **2.9%** | | 常亮模式 | **9.7%** | **2.5%** |
两个口径差别很大:「点亮像素数」把每个抗锯齿边缘像素都算成亮的,和实际功耗对不上。曾试过连进度环也砍掉,平均亮度只从 3.01% 降到 2.91% —— 0.1 个百分点换掉一个可见特征不划算,所以环保留 常亮下砍掉的东西:整条日期带底色、**整个进度环**、四个数据位与电池;保留的时间、冒号、日期压暗到 38%
模拟器可用 `Settings → Display Mode` 切换验证 两个口径要分清「点亮像素数」把每个抗锯齿边缘像素都算成亮的对大号数字表盘天然不友好AMOLED 的功耗更接近各子像素亮度之和,也就是表里的「平均亮度」。本实现两个口径都留了余量
--- ---

View File

@@ -280,51 +280,25 @@ class Fenix8V3View extends WatchUi.WatchFace {
// ------------------------------- 常亮模式 ------------------------------ // ------------------------------- 常亮模式 ------------------------------
// 低功耗画面。相比正常画面砍掉的东西: // 低功耗画面。相比正常画面砍掉的东西:
// - 日期带底色(整条亮橙色横幅是最费电的元素,直接不画) // - 日期带底色(整条亮橙色横幅是最费电的元素,直接不画)
// - 未点亮的刻度(只画有数据的那部分,且压暗到 45% // - **整个进度环**
// - 时间、冒号、日期压暗到 38%
// //
// 关于点亮量实测普通模式的平均亮度AMOLED 功耗的合理代理)是 14.1% // 度量口径要注意:「点亮像素数」把每个抗锯齿边缘像素都算成亮的,和实际
// 常亮是 2.9%,约 1/5。曾经试过连进度环也砍掉平均亮度只从 3.01% 降到 // 功耗对不上AMOLED 功耗更接近各子像素亮度之和(平均亮度)。
// 2.91% —— 0.1 个百分点换掉一个可见特征,不划算,所以环留着 // 本实现两个口径都留了余量,实测数字见 README 的常亮小节
// (常按「点亮像素数」算会得到 10% 左右,但那个口径把每个抗锯齿边缘像素
// 都算成「亮」,跟实际功耗对不上。)
// - 四个数据位、电池(全部隐藏) // - 四个数据位、电池(全部隐藏)
// 保留的时间和日期压暗到 55%。 // 保留的时间和日期压暗到 55%。
// //
// 另外整个画面按分钟在 ±4 像素内游走,避免同一个像素长期点亮导致烧屏。 // 另外整个画面按分钟在 ±4 像素内游走,避免同一个像素长期点亮导致烧屏。
// pTR/pTL/pBR/pBL 现在用不上(常亮下不画环),保留形参是为了以后要把环
// 加回来时不必改调用点。
function drawAmbient(dc as Dc, ti as Number, ds as System.DeviceSettings?, function drawAmbient(dc as Dc, ti as Number, ds as System.DeviceSettings?,
pTR as Float, pTL as Float, pBR as Float, pBL as Float) as Void { pTR as Float, pTL as Float, pBR as Float, pBL as Float) as Void {
var g = Gregorian.info(Time.now(), Time.FORMAT_SHORT); var g = Gregorian.info(Time.now(), Time.FORMAT_SHORT);
var ox = ((g.min % 5) - 2) * 2.0 / Layout.scale; // ±4 设备像素,换算回设计像素 var ox = ((g.min % 5) - 2) * 2.0 / Layout.scale; // ±4 设备像素,换算回设计像素
var oy = ((g.min / 5) % 5 - 2) * 2.0 / Layout.scale; var oy = ((g.min / 5) % 5 - 2) * 2.0 / Layout.scale;
var top = Themes.RINGTOP[ti] as Array<Number>; // 进度环在常亮下不画 —— 它是点亮像素数的大头。
var bot = Themes.RINGBOTTOM[ti] as Array<Number>;
var litTR = (pTR * Layout.TOP_N).toNumber();
var litTL = (pTL * Layout.TOP_N).toNumber();
var litBR = (pBR * Layout.BOT_N).toNumber();
var litBL = (pBL * Layout.BOT_N).toNumber();
for (var i = 0; i < Layout.TOP_N; i++) {
var a = Layout.TOP_PH + Layout.TOP_PITCH * i;
if (i >= Layout.TOP_N - litTR) {
dc.setColor(dim(top[i], 0.45), Graphics.COLOR_TRANSPARENT);
tick(dc, a, Layout.TOP_HW);
}
if (i >= Layout.TOP_N - litTL) {
dc.setColor(dim(top[i], 0.45), Graphics.COLOR_TRANSPARENT);
tick(dc, -a, Layout.TOP_HW);
}
}
for (var i = 0; i < Layout.BOT_N; i++) {
var a = Layout.BOT_PH + Layout.BOT_PITCH * i;
if (i < litBL) {
dc.setColor(dim(bot[i], 0.45), Graphics.COLOR_TRANSPARENT);
tick(dc, 180.0 + a, Layout.BOT_HW);
}
if (i < litBR) {
dc.setColor(dim(bot[i], 0.45), Graphics.COLOR_TRANSPARENT);
tick(dc, 180.0 - a, Layout.BOT_HW);
}
}
var h = g.hour; var h = g.hour;
if (ds == null || !ds.is24Hour) { if (ds == null || !ds.is24Hour) {
@@ -334,17 +308,17 @@ class Fenix8V3View extends WatchUi.WatchFace {
var mins = Themes.MINUTES[ti] as Array<Number>; var mins = Themes.MINUTES[ti] as Array<Number>;
Layout.text(dc, Layout.HOURS_R + ox, Layout.TIME_CY + oy, Layout.fontTime, Layout.text(dc, Layout.HOURS_R + ox, Layout.TIME_CY + oy, Layout.fontTime,
h.format("%d"), Graphics.TEXT_JUSTIFY_RIGHT, h.format("%d"), Graphics.TEXT_JUSTIFY_RIGHT,
dim(hours[hours.size() / 2], 0.55)); dim(hours[hours.size() / 2], 0.38));
Layout.text(dc, Layout.MINUTES_L + ox, Layout.TIME_CY + oy, Layout.fontTime, Layout.text(dc, Layout.MINUTES_L + ox, Layout.TIME_CY + oy, Layout.fontTime,
g.min.format("%02d"), Graphics.TEXT_JUSTIFY_LEFT, g.min.format("%02d"), Graphics.TEXT_JUSTIFY_LEFT,
dim(mins[mins.size() / 2], 0.55)); dim(mins[mins.size() / 2], 0.38));
dc.setColor(dim(Themes.COLON[ti] as Number, 0.55), Graphics.COLOR_TRANSPARENT); dc.setColor(dim(Themes.COLON[ti] as Number, 0.38), Graphics.COLOR_TRANSPARENT);
dc.fillRectangle(Layout.px(Layout.COLON_X + ox), Layout.px(Layout.COLON_Y1 + oy), dc.fillRectangle(Layout.px(Layout.COLON_X + ox), Layout.px(Layout.COLON_Y1 + oy),
Layout.px(Layout.COLON_W), Layout.px(Layout.COLON_H)); Layout.px(Layout.COLON_W), Layout.px(Layout.COLON_H));
dc.fillRectangle(Layout.px(Layout.COLON_X + ox), Layout.px(Layout.COLON_Y2 + oy), dc.fillRectangle(Layout.px(Layout.COLON_X + ox), Layout.px(Layout.COLON_Y2 + oy),
Layout.px(Layout.COLON_W), Layout.px(Layout.COLON_H)); Layout.px(Layout.COLON_W), Layout.px(Layout.COLON_H));
var band = dim(Themes.ACCENT[ti] as Number, 0.55); var band = dim(Themes.ACCENT[ti] as Number, 0.38);
Layout.text(dc, Layout.DOW_CX + ox, Layout.BAND_CY + oy, Layout.fontBand, Layout.text(dc, Layout.DOW_CX + ox, Layout.BAND_CY + oy, Layout.fontBand,
Fields.dow(g), Graphics.TEXT_JUSTIFY_CENTER, band); Fields.dow(g), Graphics.TEXT_JUSTIFY_CENTER, band);
Layout.text(dc, Layout.MD_CX + ox, Layout.BAND_CY + oy, Layout.fontBand, Layout.text(dc, Layout.MD_CX + ox, Layout.BAND_CY + oy, Layout.fontBand,