Flutter笔记--加水印

Flutter开发中,常常需要给某些页面加水印,有的是加文字水印,有的是需要加logo水印,简单总结如下:

API:

Stack:层叠布局,让水印 "盖在" 页面内容上面

IgnorePointer:水印不拦截点击事件

Opacity:让水印半透明,不遮挡内容

Transform.rotate:让水印斜着显示

CustomPaint:底层画布绘制,防截图、铺满屏幕水印

栗子:

Dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(const MyWaterMark01());
}

class MyWaterMark01 extends StatelessWidget {
  const MyWaterMark01({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("全屏文字水印")),
        
        body: buildWatermark(
          child: const Center(
            child: Text(
              "我是页面内容",
              textAlign: TextAlign.center,
              style: TextStyle(fontSize: 20),
            ),
          ),
          watermarkText: "Flutter 内部资料",
        ),
      ),
    );
  }


  Widget buildWatermark({required Widget child, required String watermarkText}) {
    return Stack(
      children: [
        child,
        IgnorePointer( 
          child: Opacity(
            opacity: 0.15, 
            child: Transform.rotate(
              angle: -0.35, 
              child: Center(
                child: Text(
                  watermarkText,
                  style: const TextStyle(
                    fontSize: 32,
                    color: Colors.black,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
            ),
          ),
        ),
      ],
    );
  }
}
Dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(const MyWaterMark02());
}

class MyWaterMark02 extends StatelessWidget {
  const MyWaterMark02({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("对角铺满水印")),
        body: FullScreenWatermark(
          content: const Center(
            child: Text("页面正常内容", style: TextStyle(fontSize: 24)),
          ),
          text: "内部专用 请勿外传",
        ),
      ),
    );
  }
}

class FullScreenWatermark extends StatelessWidget {
  final Widget content;
  final String text;

  const FullScreenWatermark({
    super.key,
    required this.content,
    required this.text,
  });

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        content,
        IgnorePointer(
          child: Opacity(
            opacity: 0.12,
            child: GridView.count(
              crossAxisCount: 3,
              childAspectRatio: 1.2,
              physics: const NeverScrollableScrollPhysics(),
              children: List.generate(30, (index) {
                return Center(
                  child: Transform.rotate(
                    angle: -0.4,
                    child: Text(
                      text,
                      style: const TextStyle(
                        fontSize: 18,
                        color: Colors.grey,
                      ),
                    ),
                  ),
                );
              }),
            ),
          ),
        ),
      ],
    );
  }
}
Dart 复制代码
import 'package:flutter/material.dart';

void main() {
  runApp(const MyWaterMark03());
}

class MyWaterMark03 extends StatelessWidget {
  const MyWaterMark03({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("图片水印(Logo)")),
        body: ImageWatermark(
          child: Container(
            color: Colors.white,
            child: const Center(
              child: Text("主页面内容", style: TextStyle(fontSize: 24)),
            ),
          ),
        ),
      ),
    );
  }
}

class ImageWatermark extends StatelessWidget {
  final Widget child;

  const ImageWatermark({super.key, required this.child});

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        child,
        IgnorePointer(
          child: Align(
            alignment: Alignment.bottomRight, 
            child: Opacity(
              opacity: 0.4,
              child: Container(
                width: 80,
                height: 80,
                margin: const EdgeInsets.all(20),
                child: const FlutterLogo(), 
              ),
            ),
          ),
        ),
      ],
    );
  }
}
Dart 复制代码
import 'package:flutter/material.dart';

void main() => runApp(const MaterialApp(home: CustomPaintWatermark()));

class CustomPaintWatermark extends StatelessWidget {
  const CustomPaintWatermark({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("CustomPaint 水印")),
      body: Stack(
        children: [
          // 页面内容
          const Center(
            child: Text(
              "页面内容可点击",
              style: TextStyle(fontSize: 24),
            ),
          ),

         
          IgnorePointer(
            child: Container(
              width: double.infinity,
              height: double.infinity,
              color: Colors.transparent,
              child: CustomPaint(painter: WatermarkPainter()),
            ),
          ),
        ],
      ),
    );
  }
}


class WatermarkPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
   
    final textStyle = TextStyle(
      color: Colors.grey.withOpacity(0.3), 
      fontSize: 24,
      fontWeight: FontWeight.bold,
    );

    const text = "内部资料 请勿外传";

    
    for (double x = 0; x < size.width; x += 220) {
      for (double y = 0; y < size.height; y += 200) {
        canvas.save();
        canvas.translate(x, y);
        canvas.rotate(-0.3);

        final textSpan = TextSpan(text: text, style: textStyle);
        final textPainter = TextPainter(
          text: textSpan,
          textDirection: TextDirection.ltr,
        );
        textPainter.layout();
        textPainter.paint(canvas, Offset.zero);

        canvas.restore();
      }
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}
相关推荐
qq_284274054 小时前
机械设计基础·滚动轴承全解(类型·代号·选型·寿命)+轮系与蜗杆蜗轮传动
笔记·学习·自动化·制造
ACP广源盛139246256739 小时前
硬件选型笔记:国产 PCIe Gen2.1 交换芯片 IX6024@ACP,工控与存量设备国产化改造方案评估
笔记·硬件架构·硬件工程·pcie·国产芯片
小 黄 鸡10 小时前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
文人sec10 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
摇滚侠11 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
xier_ran12 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
志尊宝12 小时前
Vue3 零基础每日笔记(078):首屏加载速度优化汇总——清单化方案
笔记
ZZHow102415 小时前
Ascend C算子开发(高级)笔记
c++·人工智能·笔记·深度学习·华为云
PC2005-cloud16 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
小陈phd16 小时前
深入理解agent学习笔记(七)——动态提示词与Skills
笔记·学习