鸿蒙全局安全水印组件实践:支持动态更新、全局生效、自定义样式

1、需求背景

很多企业内部应用,都会有这样的需求:

  • 页面显示员工姓名、工号
  • 防止截图泄露
  • 全局统一水印
  • 动态切换水印内容
  • 不影响页面交互

效果如下:


2、核心思路

本方案采用 纯 ArkUI 水印覆盖方案,核心实现思路:

  • "砖墙式" 平铺效果
  • angle属性倾斜
  • HitTest 穿透,不阻塞页面点击
  • emitter全局动态刷新

3、方案特点

  • 全屏水印层,确保水印永远位于页面最上层,所有页面都会被覆
  • 支持动态更新
  • 支持自定义样式
  • 不影响页面点击
  • 使用简单,一次接入,全 App 生效
  • 已封装为 npm 组件,真正做到开箱即用
  • 性能稳定

4、项目地址

GitHub:HarmonyWatermark

ohpm:@ericbyliang/lib_watermark


5、使用方法

5.1 安装组件

安装 ohpm 包:

ohpm install @ericbyliang/lib_watermark

5.2 页面使用

全局安全水印组件加入顶级根界面即可,永远处于页面最上层:

复制代码
import { setWatermarkText, WatermarkComponent } from '@ericbyliang/lib_watermark';
复制代码
build() {
   Root() {
        ....
        WatermarkComponent()
   }
}
5.3 全局设置水印文本

import { setWatermarkText, WatermarkComponent } from '@ericbyliang/lib_watermark';

// 设置水印,比如登录后,设置一次即可

setWatermarkText("林俊杰 2000022");

// 取消水印,比如在登录页面

setWatermarkText("");

这意味着:

  • 登录后可以设置员工信息
  • 退出登录后可以清除
  • 用户切换账号可动态刷新
5.4 动态设置水印文本&自定义水印样式

组件支持动态传参:

复制代码
WatermarkComponent({
      waterText:'周杰伦 1000001',
      textSize: 14,
      textColor: 'rgba(80,80,80, 0.01)',
      angle: -20,
      grapX: 120,
      grapY: 180
})

支持参数:

参数 说明
waterText 水印文本
textSize 字体大小(rpx)
textColor 水印颜色/透明度
angle 旋转角度
gapX 水平间距
gapY 垂直间距

6、核心代码讲解

1、组件首先通过 emitter 监听全局水印事件,实现:

  • 登录后动态设置员工信息
  • 切换账号实时刷新
  • 退出登录清除水印

2、构建一个且唯一的全屏透明覆盖层,保证水印永远处于页面最上层

Dart 复制代码
import { emitter } from "@kit.BasicServicesKit";
import { EventType } from "./EventType";

@Component
export struct WatermarkComponent {
  @Prop waterText?: string
  @Prop textSize: number = 14
  @Prop textColor: string = 'rgba(80,80,80,0.08)'
  @Prop angle: number = -20
  @Prop gapX: number = 120
  @Prop gapY: number = 180


  aboutToAppear(): void {
    emitter.on(EventType.WaterMarkEvent, (eventData: emitter.EventData) => {
      const waterText = eventData?.data?.waterText as string //全局安全水印
      this.waterText = waterText
    });
  }

  aboutToDisappear(): void {
    emitter.off(EventType.WaterMarkEvent)
  }

  build() {
    // 全屏水印层
    Stack() {
      // 在这里放重复水印
      if (this.waterText) {
        this.renderWatermark();
      }
    }
    .width('100%')
    .height('100%')
    .align(Alignment.Center)
    .backgroundColor(Color.Transparent)
    .hitTestBehavior(HitTestMode.Transparent) // 穿透点击
    .zIndex(9999);
  }

  // 绘制多个水印
  @Builder
  private renderWatermark() {
    Column() {
      ForEach(Array.from({ length: 100 }), (_: number, index: number) => {
        Row() {
          ForEach(Array.from({ length: 30 }), () => {
            Text(this.waterText)
              .fontSize(this.textSize)
              .fontColor(this.textColor) // 透明度
              .padding({ right: this.gapX, bottom: this.gapY})
          }
          )
        }.rotate({
          angle: this.angle,
        }).margin({left:index % 2 == 0?0:(this.textSize * (this.waterText||'').length) / 2})
      })
    }.margin({top:-100})
  }
}
相关推荐
春卷同学5 小时前
HarmonyOS掌上记账APP开发实践第8篇:构建可测试的鸿蒙应用 — MoneyTrack 的自动化测试体系
华为·harmonyos
梦想不只是梦与想5 小时前
鸿蒙中declare关键字
harmonyos·declare
FrameNotWork6 小时前
HarmonyOS 6.0 输入法与键盘避让 — 聊天页面底部输入栏被键盘挡住的绝望
华为·计算机外设·harmonyos
念雨思6 小时前
信用卡权益对比:基于HarmonyOS + ArkTS的AI智能金融助手开发实践
人工智能·学习·华为·金融·harmonyos·鸿蒙
不羁的木木7 小时前
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第12篇:性能优化与内存管理
图像处理·性能优化·harmonyos
拥抱太阳06167 小时前
HarmonyOS 应用开发《掌上英语》第6篇-资源管理最佳实践多模块资源复用
pytorch·深度学习·harmonyos
2301_768103498 小时前
HarmonyOS趣味相机实战第7篇:Preferences相册缓存、旧数据兼容与异常兜底
harmonyos·arkts·preferences·本地缓存·数据兼容
HONG````8 小时前
ArkTS 并发编程:TaskPool 多线程实战
harmonyos·arkts
不羁的木木8 小时前
HarmonyOS APP实战-基于Image Kit的图像处理APP - 第8篇:图片编码与保存
图像处理·华为·harmonyos