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;
}
相关推荐
守护安静星空8 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
ljt27249606618 小时前
Compose笔记(七十七)--视频录制
笔记·android jetpack
autumn20058 小时前
Flutter 框架跨平台鸿蒙开发 - 虚拟纪念馆
flutter·华为·harmonyos
不爱吃糖的程序媛8 小时前
拷贝或克隆其他 Flutter OH 项目到本地后无法运行
flutter
2301_822703209 小时前
渐变壁纸生成:基于鸿蒙Flutter的跨平台壁纸创建工具
flutter·华为·harmonyos·鸿蒙
牛马11110 小时前
Flutter BackdropFilter filter
flutter
周周不一样10 小时前
Andorid基础笔记2-jar&反射
笔记·pycharm·jar
智者知已应修善业11 小时前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
凉、介12 小时前
别再把 PCIe 的 inbound/outbound、iATU 和 eDMA 混为一谈
linux·笔记·学习·嵌入式·pcie
Utopia^12 小时前
Flutter 框架跨平台鸿蒙开发 - 旅行预算管家
flutter·华为·harmonyos