paintInkCircle method Null safety
- {required Canvas canvas,
- required Matrix4 transform,
- required Paint paint,
- required Offset center,
- required double radius,
- TextDirection? textDirection,
- ShapeBorder? customBorder,
- BorderRadius borderRadius = BorderRadius.zero,
- RectCallback? clipCallback}
Draws an ink splash or ink ripple on the passed in Canvas.
The transform argument is the Matrix4 transform that typically
shifts the coordinate space of the canvas to the space in which
the ink circle is to be painted.
center is the Offset from origin of the canvas where the center
of the circle is drawn.
paint takes a Paint object that describes the styles used to draw the ink circle.
For example, paint can specify properties like color, strokewidth, colorFilter.
radius is the radius of ink circle to be drawn on canvas.
clipCallback is the callback used to obtain the Rect used for clipping the ink effect.
If clipCallback is null, no clipping is performed on the ink circle.
Clipping can happen in 3 different ways:
- If
customBorderis provided, it is used to determine the path for clipping. - If
customBorderis null, andborderRadiusis provided, the canvas is clipped by an RRect created fromclipCallbackandborderRadius. - If
borderRadiusis the default BorderRadius.zero, then the Rect provided byclipCallbackis used for clipping.
textDirection is used by customBorder if it is non-null. This allows the customBorder's path
to be properly defined if it was the path was expressed in terms of "start" and "end" instead of
"left" and "right".
For examples on how the function is used, see InkSplash and InkRipple.
Implementation
@protected
void paintInkCircle({
required Canvas canvas,
required Matrix4 transform,
required Paint paint,
required Offset center,
required double radius,
TextDirection? textDirection,
ShapeBorder? customBorder,
BorderRadius borderRadius = BorderRadius.zero,
RectCallback? clipCallback,
}) {
assert(canvas != null);
assert(transform != null);
assert(paint != null);
assert(center != null);
assert(radius != null);
assert(borderRadius != null);
final Offset? originOffset = MatrixUtils.getAsTranslation(transform);
canvas.save();
if (originOffset == null) {
canvas.transform(transform.storage);
} else {
canvas.translate(originOffset.dx, originOffset.dy);
}
if (clipCallback != null) {
final Rect rect = clipCallback();
if (customBorder != null) {
canvas.clipPath(customBorder.getOuterPath(rect, textDirection: textDirection));
} else if (borderRadius != BorderRadius.zero) {
canvas.clipRRect(RRect.fromRectAndCorners(
rect,
topLeft: borderRadius.topLeft, topRight: borderRadius.topRight,
bottomLeft: borderRadius.bottomLeft, bottomRight: borderRadius.bottomRight,
));
} else {
canvas.clipRect(rect);
}
}
canvas.drawCircle(center, radius, paint);
canvas.restore();
}