addWithPaintTransform method Null safety
- {required Matrix4? transform,
- required Offset position,
- required BoxHitTest hitTest}
Transforms position
to the local coordinate system of a child for
hit-testing the child.
The actual hit testing of the child needs to be implemented in the
provided hitTest
callback, which is invoked with the transformed
position
as argument.
The provided paint transform
(which describes the transform from the
child to the parent in 3D) is processed by
PointerEvent.removePerspectiveTransform to remove the
perspective component and inverted before it is used to transform
position
from the coordinate system of the parent to the system of the
child.
If transform
is null it will be treated as the identity transform and
position
is provided to the hitTest
callback as-is. If transform
cannot be inverted, the hitTest
callback is not invoked and false is
returned. Otherwise, the return value of the hitTest
callback is
returned.
The position
argument may be null, which will be forwarded to the
hitTest
callback as-is. Using null as the position can be useful if
the child speaks a different hit test protocol than the parent and the
position is not required to do the actual hit testing in that protocol.
The function returns the return value of the hitTest
callback.
abstract class RenderFoo extends RenderBox {
final Matrix4 _effectiveTransform = Matrix4.rotationZ(50);
@override
void applyPaintTransform(RenderBox child, Matrix4 transform) {
transform.multiply(_effectiveTransform);
}
@override
bool hitTestChildren(BoxHitTestResult result, { required Offset position }) {
return result.addWithPaintTransform(
transform: _effectiveTransform,
position: position,
hitTest: (BoxHitTestResult result, Offset position) {
return super.hitTestChildren(result, position: position);
},
);
}
}
See also:
- addWithPaintOffset, which can be used for
transform
s that are just simple matrix translations by an Offset. - addWithRawTransform, which takes a transform matrix that is directly used to transform the position without any pre-processing.
Implementation
bool addWithPaintTransform({
required Matrix4? transform,
required Offset position,
required BoxHitTest hitTest,
}) {
assert(position != null);
assert(hitTest != null);
if (transform != null) {
transform = Matrix4.tryInvert(PointerEvent.removePerspectiveTransform(transform));
if (transform == null) {
// Objects are not visible on screen and cannot be hit-tested.
return false;
}
}
return addWithRawTransform(
transform: transform,
position: position,
hitTest: hitTest,
);
}