闪控窗能容纳多少文字,不能只看设计图中的矩形尺寸。一旦系统字体放大,任务标题会换行,状态说明会向下挤,原本并列的三个操作按钮可能只剩一部分可见。危险之处不在于布局不够漂亮,而在于“暂停”这种关键动作看着存在、却落到了用户难以点击的位置。这里用 FloatReadabilityDemo 设计一个小窗布局选择器。任务是文件整理,标识为 A11Y_R05_01;示例里应用内容区宽 268vp、高 152vp,字体比例 1.45。这是固定用例输入,不代表任何设备的系统返回值。目标是让大字模式下界面退化为 SUMMARY,仍能看见进度和一个“暂停”按钮,其他两个次级操作回到应用主页面。## 一、先量控件是否可达,再谈展示多少内容完整态希望同时展示任务名称、已处理条数、进度、暂停、取消和详情入口。假设设计稿只有一个默认字号,这种排法当然很紧凑。可是字体变化是外部条件:同一段“正在整理摄影素材”在小字号可能只占一行,在较大字号下就会侵占按钮区域。即使文字使用省略号,也不能说明被遮掉的内容对操作无影响。要避免把问题转嫁给用户,需要拆分三个维度:窗口实际可用的内容区域、文字对排版的占用、必须保留的安全操作。窗口尺寸和系统模板是两回事;应用可能请求某个形态,实际显示的窗口边界仍应以系统确认后的可用区域为准。HarmonyOS 的闪控窗指南提供了窗口形态与显示区域的系统能力,但本文不复写尚未逐项验证的创建参数或错误码签名。Demo 为了把焦点放在业务布局决策,直接注入 268 × 152vp 的内容矩形和 1.45 的字体比例。这样的注入方式可让团队讨论“给定空间里优先保护什么”,而不被窗口创建流程分散注意力。接入真实小窗时,应用应把获得的有效区域转换到统一的布局单位,并在形态变化后重新计算,不能把一次取到的宽度永久缓存。## 二、紧凑态要有确定的裁剪顺序当前界面定义三档:空间充分时为 RICH,大字或偏窄时为 SUMMARY,剩余空间不足以保障关键按钮时为 OPEN_MAIN。档位名称是 Demo 自己的业务枚举,不是 HarmonyOS 平台公开的浮窗状态。阈值同样是示例设计基线,需要用目标设备和辅助功能组合进行可达性验证,不能直接引用成系统规定。首先用纯函数让判断可复算。它只接受内容区域和字体比例,不在函数里读窗口、修改组件或者执行任务操作,因此更容易分别验证布局输入与动作输出。tstype FloatMode = 'RICH' | 'SUMMARY' | 'OPEN_MAIN';interface FloatMetrics { widthVp: number; heightVp: number; fontScale: number;}export function chooseFloatMode(m: FloatMetrics): FloatMode { if (!Number.isFinite(m.widthVp) || !Number.isFinite(m.heightVp) || !Number.isFinite(m.fontScale)) return 'OPEN_MAIN'; if (m.widthVp < 240 || m.heightVp < 112 || m.fontScale <= 0) { return 'OPEN_MAIN'; } if (m.widthVp < 300 || m.fontScale >= 1.30) return 'SUMMARY'; return 'RICH';}````OPEN_MAIN` 不应理解为应用能够强制关闭系统窗口,而是业务层判断小窗已经不适合承载操作,应提供返回主页面的明确入口。选择函数对于 `268vp、152vp、1.45` 给出 `SUMMARY`。在这一档,我们规定保留任务名称、`68%` 的预置进度以及唯一的“暂停”主按钮;“取消”和“查看详情”只在主页面保留。把可达动作固定为一个,是此例的产品选择,不是平台按钮数量限制。如果把判断写在三个组件各自的条件分支里,风险在于标题先决定换行、操作区再判断宽度,结果某个分支在文本更新后没有同步重算。集中输出档位能减少这种状态分裂。正式工程还应增加输入变化的防抖和可视区域回执,但不要为了避免视觉抖动而延迟紧急按钮的可用性。## 三、文字溢出和操作按钮是两类问题ArkUI 的 `Text.maxLines` 和 `textOverflow` 可以限制文字显示范围。它们解决的是内容怎样排版,不是可操作性如何保证。在紧凑态,任务标题可以显示一行并省略末尾,按钮则不应缩到无法触达的高度。下面展示组件如何根据业务档位更换信息密度;这里的 `@StorageProp` 绑定用到官方 Environment 字体比例属性,必须先在应用环境中按照文档启用对应环境参数。ts@Entry@Componentstruct CompactTaskPage { @StorageProp(‘fontScale’) fontScale: number = 1; @State widthVp: number = 268; @State heightVp: number = 152; @State paused: boolean = false; private currentMode(): FloatMode { return chooseFloatMode({ widthVp: this.widthVp, heightVp: this.heightVp, fontScale: this.fontScale }); } build() { Column({ space: 8 }) { Text(‘摄影素材整理 · A11Y_R05_01’) .fontSize(15).maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }); Text(‘进度 68%’).fontSize(14); if (this.currentMode() !== ‘OPEN_MAIN’) { Button(this.paused ? ‘继续’ : ‘暂停’) .height(48).onClick(() => { this.paused = !this.paused; }); } else { Text(‘请在主页面继续操作’).fontSize(14); } }.padding(12).width(‘100%’); }}这段代码是最小化的页面示例,不是可直接替代闪控窗接入流程的完整工程。`widthVp` 和 `heightVp` 在 Demo 中作为注入值;接入真实系统时,必须由经过确认的内容区域更新这两个状态。`fontScale` 如果没有在应用环境正确配置,也不能期待系统字号变化自动驱动本页更新。单独的 `paused` 只是可视化演示状态,真正暂停任务需要连接后台任务控制器,等它返回确认后再更新 UI。按钮明确给了 `48vp` 的业务高度,避免为了多塞一行文字而无限压缩触控范围。具体可触达尺寸仍应由设计和无障碍测试确认;本文不把 `48vp` 宣称为所有 HarmonyOS 系统 API 的强制最小值。用户在系统辅助设置中调高字体后,还应检查屏幕朗读顺序、聚焦顺序与暂停按钮可见性,而不能只截图比较字有多大。![](https://i-blog.csdnimg.cn/direct/cb4e40b28d8e4ae6b331862059db0c80.png)## 四、状态命令不能被一个视觉开关替代正式任务暂停通常是异步动作。用户连续点击两次,或者窗口快速切到主页面,如果组件每点一次就立即把任务状态取反,会出现 UI 显示“继续”而后台仍在整理的情况。一个安全的业务层应该区分“已请求暂停”和“任务确认暂停”。本 Demo 用一个纯函数表示确认回执;它不调用系统浮窗接口,也不模拟后台任务已经成功暂停。tsinterface TaskSnapshot { revision: number; running: boolean; taskId: string;}interface TaskAck { revision: number; paused: boolean; taskId: string;}function acceptTaskAck(s: TaskSnapshot, ack: TaskAck): TaskSnapshot { if (s.taskId !== ack.taskId || ack.revision <= s.revision) return s; return { taskId: s.taskId, revision: ack.revision, running: !ack.paused };}```判断里既匹配 taskId,也比较业务修订号,是为了阻挡较旧任务回执覆盖新状态。修订号必须由可信的任务调度层维护,不能简单在 UI 回调里随手加一就宣称实现了一致性协议。小窗销毁时,应该清理自身订阅和定时器;后台任务是否继续运行、如何恢复入口,是业务生命周期决策,不能因为视图不见了就推定整理任务已经结束。日志可以围绕 A11Y_R05_01 width=268 height=152 fontScale=1.45 和 mode=SUMMARY visibleActions=1 hiddenActions=2 组织。这里的 READABLE 只是业务规则给出的理论判定标签,不能替代实际触控区域和无障碍辅助技术的测试结果。即使页面展示了“暂停”,在任务调度器未确认回执之前也不应写成 PAUSED。## 五、把信息放回正确的地方这张手机演示图显示任务管理主页面,以及代表闪控窗内容的简化预览卡片。主页面保留完整操作说明,紧凑卡片只留关键状态。它只是静态 UI 示意,不证明系统已经创建真实浮窗,更不能替代对不同模板、设备、字体档位的实际调试。调试顺序可以分三轮。第一轮只测试纯决策函数的边界:239vp 与 240vp、299vp 与 300vp、1.29 与 1.30,确认不会在临界值产生不明状态。第二轮把 SUMMARY 输出灌入独立 ArkUI 页面,人工检查文本是否压住按钮、长任务名是否截断过度、操作顺序是否合理。第三轮再进入真机小窗流程,记录系统确认的区域、字体变化、模板切换和焦点移动,必要时修正业务阈值。结果指标要区分三种:布局规则选出了哪一档,UI 绘制后按钮是否在可见范围内,用户是否真的能够点击。本文只给出第一种的可复算期望与后两种的验证路线,没有实机完成率或性能数据。作为最小实现,组件也没有处理语言从中文切换到长英文、屏幕朗读焦点回退、窗口被系统收起等完整产品情形。真正的取舍,是不把小窗当成缩小的主页面。字号变化时优先保留“用户现在最需要做什么”,次级选项移回完整页面;布局可以降级,操作意图不能被吞掉。OPEN_MAIN 必须是清晰、可执行的回退路径,而不是把最重要的按钮也隐藏后留下一张只有百分比的卡片。ArkTS 示例未在 DevEco 编译运行,图中状态与 HiLog 文本均为预设设计用例。资料核对:华为官方闪控窗使用指南、ArkUI Text 组件及 Environment 字体比例文档;窗口模板限制和 API 版本以实际设备与 SDK 的官方文档为准,本篇不推断未核实的系统签名。参考链接:闪控窗开发指南;ArkUI Environment 字体比例;Text 组件显示。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐