美文网首页
Flutter 水印

Flutter 水印

作者: 在幽幽暗暗反反复复中追问 | 来源:发表于2021-07-20 17:05 被阅读0次

项目快完成了,来了个加水印的需求。。。
到 pub.dev 上看了下,SDK 要求 Flutter 2 版本,但是我用的是 1.x.x
那就自己写

关键:

  1. 使用 mixin,不用过多修改现有的页面
  2. 使用 Stack 和 Positon,画出水印层
  3. 水印层一定是用户看到的最上层,所以是 Stack 的 children 中的最后一个 widget
  4. 水印层是 Stack 的 children 中的最后一个 widget,导致真正要操作的 widget 没能获得手势事件
  5. 水印层外包裹 IgnorePointer,忽略事件(本来往事件穿透方向去想,但是事件穿透更多是父子关系中)
效果

代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

mixin WaterMarkerMixin<T extends StatefulWidget> on State<T> {
  Widget draw({
    String text = "water marker",
    @required Widget child,
    int countPerLine = 3,
    Matrix4 transform,
    TextStyle style = const TextStyle(
      color: Color(0xFFE3E3E3),
      fontSize: 14,
      decoration: TextDecoration.none,
    ),
  }) {
    return Stack(children: [
      child,
      Positioned(
        left: 0,
        right: 0,
        top: 0,
        bottom: 0,
        child: IgnorePointer(
          child: _buildMarkers(
            text: text,
            style: style,
            countPerLine: countPerLine,
            transform: transform,
          ),
        ),
      ),
    ]);
  }

  Widget _buildMarkers({
    @required String text,
    TextStyle style,
    int countPerLine,
    Matrix4 transform,
  }) {
    double itemWidth = MediaQuery.of(context).size.width / countPerLine;

    /// 几行  可以 + 1
    int lineCount = (MediaQuery.of(context).size.height / itemWidth).round();

    List<Widget> children = List.filled(
      lineCount * countPerLine,
      Container(
        child: new Transform(
          alignment: Alignment.center,
          transform: transform ?? Matrix4.skewY(0.3), //沿Y轴倾斜0.3弧度
          child: Center(
            child: Text(
              text,
              style: style,
              textAlign: TextAlign.center,
            ),
          ),
        ),
      ),
    );

    return GridView(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: countPerLine,
        // crossAxisSpacing: 3,
        // mainAxisSpacing: 3,
      ),
      physics: NeverScrollableScrollPhysics(),
      children: children,
    );
  }
}

使用

class TestPage extends StatefulWidget {
  const TestPage({Key key}) : super(key: key);

  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> with WaterMarkerMixin {
  @override
  Widget build(BuildContext context) {
    return super.draw(child: Text('test page'));
  }
}

相关文章

  • Flutter 水印

    项目快完成了,来了个加水印的需求。。。到 pub.dev 上看了下,SDK 要求 Flutter 2 版本,但是我...

  • Flutter 水印效果

    公司业务需要做可以超出屏幕的水印效果,但是网上找的一些都不符合条件,所以决定自己来做一个。 因为flutter普通...

  • Flutter 视频加水印

    这样,公司有个需求要加水印,结果一搜,居然没有现成的用,诸位真是不给力啊. 于是就去pub找,还真有一个封装好的f...

  • Flutter给图片添加水印

    Flutter给图片添加水印,有两种方法第一种:直接操作图片,将水印文字与图片一起编码生成新的图片; 第二种:用S...

  • 水印王iOS1.3版本更新说明

    水印王1.3版本更新部分 修改背景模糊效果 增加水印模式(文字水印,图片水印,涂鸦,模版) 增加模版保存功能 水印...

  • 柠檬水印助手app技术服务支持

    柠檬水印助手是一块好用的水印处理软件,可以视频图片去水印,加水印。

  • 2020-06-29

    各种页面中添加水印,vue添加水印 /* 添加水印函数addWaterMarker str:水印显示的文本内容 *...

  • 16/100 如何制作全屏水印

    工具:水印相机 步骤:图片——水印——选择全屏水印——调整透明度

  • 对于文章图片中水印的问题

    处理图片水印:下面的函数可以处理局部的水印,详细请看函数文档该函数适合处理位置固定的水印. 在水印位置覆盖新的水印...

  • iOS给图片添加文字水印和图片水印

    加水印的方式有很多,比如给图片添加图片水印、文字水印,或者给视频添加图片水印、文字水印。本文首先讲解如何给图片添加...

网友评论

      本文标题:Flutter 水印

      本文链接:https://www.haomeiwen.com/subject/ynalmltx.html