【HarmonyOS NEXT】实现页面水印功能

关键词:鸿蒙、水印、Watermark、页面、触摸问题

注:本期文章同样适用 OpenHarmony 的开发

在app开发过程中时常会出现敏感信息页面,为保护信息安全和及时的数据追踪,通常会采用给页面加水印的形式,那么本期文章会介绍如何在鸿蒙应用中实现页面水印的功能。

本期文章代码比较简单,核心逻辑为 ①对触摸事件的穿透控制②组件 .overlay() 浮层的使用,可自行修改 Watermark() 构建函数代码调整至自己业务所适合的样式。

触摸测试控制可参考官方文档:文档中心

效果如下:

完整代码:

如下代码使用 Canvas 画布绘制水印,计算当前屏幕展示水印个体个数进行渲染。当然也可以自行使用网格或其他布局实现效果。overlay 浮层也可替换使用 Stack() 层叠布局,本质在上方覆盖一层文本浮层即可。

需要注意的是:浮层是在跟容器组件的上层,所以需要给上层组件设置 .hitTestBehavior(HitTestMode.Transparent) 属性,穿透触摸事件至根容器,避免触摸事件被水印层拦截。

javascript 复制代码
@Entry
@Component
struct Index {
  @State message: string = '你好鸿蒙 Hello Harmony,这是一段普通文本测试水印效果';
  private settings: RenderingContextSettings = new RenderingContextSettings(true);
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
  // 水印容器宽高
  private water1wh: number = 140

  /**
   * 水印构造器
   * @param waterText 水印文本
   * @param fontSize 字号
   * @param fontColor 颜色
   */
  @Builder
  Watermark2(waterText: string, fontSize: string, fontColor: string) {
    Canvas(this.context)
      .width("100%")
      .height("100%")// 设置触摸测试控制,不影响跟节点触摸
      .hitTestBehavior(HitTestMode.Transparent)
      .onReady(() => {
        this.context.fillStyle = fontColor;
        this.context.font = fontSize;
        this.context.textAlign = "center"; // 单个容器中垂直居中
        // 计算屏幕中可摆放多少个水印个体,遍历渲染
        for (let i = 0; i < this.context.width / this.water1wh; i++) {
          this.context.translate(this.water1wh, 0);
          let j = 0;
          for (; j < this.context.height / this.water1wh; j++) {
            this.context.rotate(-Math.PI / 180 * 30);
            // 设置文本偏移
            this.context.fillText(waterText, -(this.water1wh / 2), -(this.water1wh / 2));
            this.context.rotate(Math.PI / 180 * 30);
            this.context.translate(0, this.water1wh);
          }
          this.context.translate(0, -this.water1wh * j);
        }
      })
  }

  build() {
    // overlay 浮层用法
    RelativeContainer() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .id("Text1")
        .onClick(() => {
          console.log("luvi > 触摸测试")
        })
        .alignRules({
          middle: { anchor: "__container__", align: HorizontalAlign.Center },
          center: { anchor: "__container__", align: VerticalAlign.Center }
        })
        .id("base")
    }
    // 在当前组件上,增加叠加自定义组件以作为该组件的浮层
    .overlay(this.Watermark2("20241012 张三", "15vp", "#2a000000"))
    .height('100%')
    .width('100%')

    // 层叠布局用法
    // Stack() {
    //   RelativeContainer() {
    //     Text(this.message)
    //       .fontSize(50)
    //       .fontWeight(FontWeight.Bold)
    //       .id("Text1")
    //       .onClick(() => {
    //         console.log("luvi > 触摸测试")
    //       })
    //       .alignRules({
    //         middle: { anchor: "__container__", align: HorizontalAlign.Center },
    //         center: { anchor: "__container__", align: VerticalAlign.Center }
    //       })
    //       .id("base")
    //   }
    //   .height('100%')
    //   .width('100%')
    //
    //   this.Watermark2("20241012 张三", "15vp", "#2a000000")
    // }
  }
}

水了水了...

相关推荐
maaath3 分钟前
【maaath】Flutter for OpenHarmony 实战:旅游攻略应用开发指南
flutter·华为·harmonyos
三声三视2 小时前
ArkTS 性能优化实战:从卡顿分析到高帧率应用全攻略
华为·性能优化·harmonyos·鸿蒙
小雨青年3 小时前
鸿蒙 HarmonyOS 6 | PDFKit预览能力升级实战
华为·harmonyos
花先锋队长5 小时前
鸿蒙6.1加持菜鸟App:地理围栏+实况窗,靠近驿站自动提醒,取件不再遗漏
华为·智能手机·harmonyos
nashane5 小时前
HarmonyOS 6学习:页面跳转弹窗状态保持全解析
学习·华为·harmonyos·harmonyos 5
maaath5 小时前
【maaath】Flutter for OpenHarmony 实战:电影榜单应用开发指南
flutter·华为·harmonyos
若兰幽竹7 小时前
【HarmonyOS 6.1 全场景实战】开篇词:打造消除“吃饭焦虑”的《灵犀厨房》
harmonyos·鸿蒙开发·华为鸿蒙系统
机构师7 小时前
<鸿蒙><APP><3D>鸿蒙3D开发,如何获取ktx格式的天空盒图?
华为·harmonyos
xmdy58668 小时前
Flutter+开源鸿蒙实战|智安盾电商溯源平台Day6 登录逻辑+积分体系+全局收尾优化
flutter·华为·harmonyos
前端不太难8 小时前
AISystem:鸿蒙游戏中的 AI 行为驱动
人工智能·游戏·harmonyos