addWithPaintTransform method
- 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
transforms 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,
}) {
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);
}