paintUnit method
绘制"单元水印",完整的水印是由单元水印重复平铺组成,返回值为"单元水印"占用空间的大小。
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,
);
}