HarmonyOS鸿蒙Next中想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩

HarmonyOS鸿蒙Next中想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩 【问题描述】:我们想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩,并且还需要实现遮罩的动画效果,以及不影响其它三方应用的触控操作。

【问题现象】:咨询实现方案,效果类似于附件视频文件

11 回复

尊敬的开发者,您好,如果希望实现该能力,辛苦您提供以下信息:

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS鸿蒙Next中想开发一个全局跨应用光栅遮罩,类似于护眼模式的那种屏幕遮罩的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


需要开发一款弱视训练的app

很好的想法,但是做不到

普通三方应用基本不能实现真正跨应用、全局、且不影响触控的遮罩。护眼模式这类效果属于系统显示管线或系统级能力,不是普通应用在最上层放一个透明窗口就能完成的。

原因主要有三点:

  1. HarmonyOS NEXT 对窗口层级和跨应用覆盖有安全隔离,普通应用不能长期覆盖其他应用或桌面。
  2. 如果遮罩窗口能盖在其他应用上,还要同时触控穿透,会涉及输入安全和防误导风险。
  3. 光栅/防窥/护眼这类效果通常要在系统合成或显示链路处理,三方应用只能处理自己窗口内的内容。

可行替代方案是:如果只影响本应用,就在根 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 中实现全局跨应用遮罩(类似护眼模式)且不影响触控,可基于系统悬浮窗 + 窗口穿透方案,关键步骤如下:

  1. 声明权限
    module.json5 中申请 ohos.permission.SYSTEM_FLOAT_WINDOW 权限,并用户在设置里授权。

  2. 创建悬浮窗
    在主界面的 onWindowStageCreate 中使用 window.createWindow 创建子窗口,设置类型为 WindowType.TYPE_FLOATTYPE_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);
    

    设置遮罩背景色(如半透明黄色)并显示。

  3. 动画效果
    通过改变窗口背景透明度或颜色矩阵实现渐变动画,例如使用 animateTo 控制窗口属性或直接覆写背景色。

  4. 遮罩层级
    通过 setWindowTopmost(true) 保持遮罩在最上层。
    注意:普通应用受系统限制,遮罩可能不覆盖状态栏和三方全屏应用;若需完全全局覆盖,需使用系统级签名或无障碍服务(需用户开启)辅助实现。

核心就是“不可触摸的全屏悬浮窗”,记得在不需要时销毁窗口释放资源。

回到顶部