getClip method
- Size size
override
Returns a description of the clip given that the render object being clipped is of the given size.
Implementation
@override
Path getClip(Size size) {
//基础数据
final double w = size.width;
final double h = size.height;
final double r = _getDiagonal(size) / 2 + lensAperture;
final Offset center = Offset(w / 2, h / 2);
//准备叶片路径
Path bladePath = Path();
//起始点
final Offset start =
center.translate(-math.sqrt(3) / 2 * lensAperture, lensAperture / 2);
bladePath.moveTo(start.dx, start.dy);
//顶点
final double b = math.sqrt(r * r + r - lensAperture * lensAperture);
bladePath.lineTo(start.dx, start.dy - b);
//画弧
final double endX = r * (math.sqrt(3) / 2) + center.dx;
final double endY = -r / 2 + center.dy;
bladePath.arcToPoint(Offset(endX, endY), radius: Radius.circular(r));
bladePath.close();
//平移
bladePath = bladePath.shift(Offset(0, -r * (1 - animation.value)));
//准备联合路径
Path path = bladePath;
//循环联合路径
for (int i = 1; i <= 5; i++) {
final Matrix4 rM =
Matrix4Transform().rotateDegrees(i * 60, origin: center).matrix4;
path = Path.combine(
PathOperation.union, path, bladePath.transform(rM.storage));
}
//镜头旋转
final Matrix4 roate = Matrix4Transform()
.rotateDegrees(lensAngle * animation.value, origin: center)
.matrix4;
return path.transform(roate.storage);
}