paintUnit method

  1. @override
Size paintUnit(
  1. Canvas canvas,
  2. double devicePixelRatio
)
override

绘制"单元水印",完整的水印是由单元水印重复平铺组成,返回值为"单元水印"占用空间的大小。 devicePixelRatio: 因为最终要将绘制内容保存为图片,所以在绘制时需要根据屏幕的 DPR来放大,以防止失真

Implementation

@override
Size paintUnit(Canvas canvas, double devicePixelRatio) {
  //根据屏幕 devicePixelRatio 对文本样式中长度相关的一些值乘以devicePixelRatio
  final _textStyle = _handleTextStyle(devicePixelRatio);
  final _padding = padding * devicePixelRatio;

  //构建文本画笔
  TextPainter painter = TextPainter(
    textDirection: TextDirection.ltr,
    textScaleFactor: devicePixelRatio,
  );
  //添加文本和样式
  painter.text = TextSpan(text: text, style: _textStyle);
  //对文本进行布局
  painter.layout();

  //文本占用的真实宽度
  final textWidth = painter.width;
  //文本占用的真实高度
  final textHeight = painter.height;

  // 将弧度转化为度数
  final radians = math.pi * rotate / 180;

  //通过三角函数计算旋转后的位置和size
  final orgSin = math.sin(radians);
  final sin = orgSin.abs();
  final cos = math.cos(radians).abs();

  final width = textWidth * cos;
  final height = textWidth * sin;
  final adjustWidth = textHeight * sin;
  final adjustHeight = textHeight * cos;

  if (orgSin >= 0) {
    canvas.translate(
      adjustWidth + _padding.left,
      _padding.top,
    );
  } else {
    canvas.translate(
      _padding.left,
      height + _padding.top,
    );
  }
  canvas.rotate(radians);
  // 绘制文本
  painter.paint(canvas, Offset.zero);

  return Size(
    width + adjustWidth + _padding.horizontal,
    height + adjustHeight + _padding.vertical,
  );
}