HarmonyOS鸿蒙Next中想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩
HarmonyOS鸿蒙Next中想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩 【问题描述】:我们想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩,并且还需要实现遮罩的动画效果,以及不影响其它三方应用的触控操作。
【问题现象】:咨询实现方案,效果类似于附件视频文件
尊敬的开发者,您好,如果希望实现该能力,辛苦您提供以下信息:
请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。
更多关于HarmonyOS鸿蒙Next中想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
需要开发一款弱视训练的app
很好的想法,但是做不到
普通三方应用基本不能实现真正跨应用、全局、且不影响触控的遮罩。护眼模式这类效果属于系统显示管线或系统级能力,不是普通应用在最上层放一个透明窗口就能完成的。
原因主要有三点:
- HarmonyOS NEXT 对窗口层级和跨应用覆盖有安全隔离,普通应用不能长期覆盖其他应用或桌面。
- 如果遮罩窗口能盖在其他应用上,还要同时触控穿透,会涉及输入安全和防误导风险。
- 光栅/防窥/护眼这类效果通常要在系统合成或显示链路处理,三方应用只能处理自己窗口内的内容。
可行替代方案是:如果只影响本应用,就在根 Stack 上加遮罩层,并按需要设置 hitTestBehavior/响应区域;如果目标是全系统效果,只能作为系统能力诉求或特定受控能力申请,不建议按普通应用悬浮窗思路设计。
找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,
系统应用是没有开放全局遮罩这种权限的
全屏画中画+hitTestBehavior穿透,试试吧。
如果你的目标是在 HarmonyOS NEXT 上实现类似:
- 护眼模式
- 防窥膜效果
- 光栅动画
- 全局变暗
- 灰度屏
- 色彩滤镜
这种跨应用全局遮罩层,目前需要先明确一个关键结论:
结论
普通三方应用无法实现真正意义上的全局跨应用遮罩。
原因是 HarmonyOS NEXT 的窗口管理有严格的安全隔离机制:
应用A
↓
无法覆盖
↓
应用B
应用A
↓
无法覆盖
↓
桌面Launcher
应用A
↓
无法覆盖
↓
系统设置
类似 Android 时代的:
SYSTEM_ALERT_WINDOW
TYPE_APPLICATION_OVERLAY
这种全局悬浮窗能力,在 HarmonyOS NEXT 中并未向普通应用开放。
为什么护眼模式能做到?
系统护眼模式实际上不是:
最上层放一个半透明窗口
而是:
显示管线
↓
SurfaceComposer
↓
Display Manager
↓
GPU合成
↓
颜色矩阵
直接在系统显示链路修改颜色。
例如:
蓝光过滤
灰度模式
电子书模式
色温调整
都属于:
Display Color Transform
级别能力。
普通应用拿不到。
如果是普通应用能做到什么?
方案1:应用内遮罩
自己应用内部:
Stack() {
AppContent()
Column()
.width('100%')
.height('100%')
.backgroundColor('#55000000')
}
可以实现:
- 夜间模式
- 光栅效果
- 动画效果
但只能覆盖自己。
方案2:悬浮窗(系统授权场景)
HarmonyOS NEXT 当前公开API:
WindowStage
SubWindow
DialogWindow
只能在:
本应用窗口体系
内部显示。
无法跨应用。
光栅遮罩动画能实现吗?
如果只是在自己的应用中:
完全可以。
例如:
Canvas()
绘制:
|||||||||||||
|||||||||||||
|||||||||||||
然后:
.animateTo()
实现:
移动光栅
扫描线
百叶窗
呼吸遮罩
效果。
如果必须跨应用怎么办?
目前只有三种可能:
1. 系统应用
拥有:
System Capability
System App
权限。
例如:
- 护眼模式
- 智慧视觉
- 截屏工具
这类系统级应用。
2. 定制ROM
如果是:
OpenHarmony
设备厂商项目:
工业平板
医疗设备
车机
教育终端
自己控制系统镜像。
可以在:
WindowManager
DisplayManager
RenderService
层面增加全局遮罩。
3. 企业合作方案
与华为合作获得:
System API
Partner Capability
但这通常面向:
- 车机
- 教育
- 政企终端
普通应用无法申请。
如果你的视频效果类似这些
全屏变暗
扫描线
百叶窗
防窥光栅
电子书滤镜
护眼滤镜
色温遮罩
那么:
| 能力 | 三方应用 |
|---|---|
| 覆盖自己应用 | ✅ |
| 覆盖其他应用 | ❌ |
| 覆盖桌面 | ❌ |
| 覆盖系统设置 | ❌ |
| 实现动画光栅 | ✅ |
| 全局护眼模式 | ❌ |
| 系统级显示滤镜 | ❌ |
所以在 HarmonyOS NEXT 当前开放能力下,三方应用无法实现真正的全局跨应用光栅遮罩(且不影响触摸)。这种能力已经属于系统显示服务层,而不是应用层能力。
想法很好,现在系统还没有开放这样的权限哦。
在HarmonyOS NEXT中,可使用@ohos.window.dialog创建系统级悬浮窗,设置type: window.DialogType.SYSTEM_ALERT并指定半透明背景遮罩。或通过window.createSubWindow实现跨应用全局叠加。需声明ohos.permission.SYSTEM_FLOAT_WINDOW权限。利用ArkUI组件设置opacity和全屏尺寸即可。
在 HarmonyOS Next 中实现全局跨应用遮罩(类似护眼模式)且不影响触控,可基于系统悬浮窗 + 窗口穿透方案,关键步骤如下:
-
声明权限
在module.json5中申请ohos.permission.SYSTEM_FLOAT_WINDOW权限,并用户在设置里授权。 -
创建悬浮窗
在主界面的onWindowStageCreate中使用window.createWindow创建子窗口,设置类型为WindowType.TYPE_FLOAT或TYPE_APPLICATION_OVERLAY,全屏尺寸且不可聚焦、不可触摸:let config = { name: 'overlay', windowType: window.WindowType.TYPE_FLOAT, ctx: this.context }; let win = window.createWindow(config); win.setWindowLayoutFullScreen(true); win.setWindowTouchable(false); // 关键:触摸穿透 win.setWindowFocusable(false);设置遮罩背景色(如半透明黄色)并显示。
-
动画效果
通过改变窗口背景透明度或颜色矩阵实现渐变动画,例如使用animateTo控制窗口属性或直接覆写背景色。 -
遮罩层级
通过setWindowTopmost(true)保持遮罩在最上层。
注意:普通应用受系统限制,遮罩可能不覆盖状态栏和三方全屏应用;若需完全全局覆盖,需使用系统级签名或无障碍服务(需用户开启)辅助实现。
核心就是“不可触摸的全屏悬浮窗”,记得在不需要时销毁窗口释放资源。

