Add some Transform constructors (#16553)
See https://github.com/flutter/flutter/pull/15383
This commit is contained in:
parent
7d5e5ebc94
commit
ca35ddd439
@ -819,6 +819,8 @@ class PhysicalShape extends SingleChildRenderObjectWidget {
|
|||||||
///
|
///
|
||||||
/// * [RotatedBox], which rotates the child widget during layout, not just
|
/// * [RotatedBox], which rotates the child widget during layout, not just
|
||||||
/// during painting.
|
/// during painting.
|
||||||
|
/// * [FractionalTranslation], which applies a translation to the child
|
||||||
|
/// that is relative to the child's size.
|
||||||
/// * [FittedBox], which sizes and positions its child widget to fit the parent
|
/// * [FittedBox], which sizes and positions its child widget to fit the parent
|
||||||
/// according to a given [BoxFit] discipline.
|
/// according to a given [BoxFit] discipline.
|
||||||
class Transform extends SingleChildRenderObjectWidget {
|
class Transform extends SingleChildRenderObjectWidget {
|
||||||
@ -866,6 +868,67 @@ class Transform extends SingleChildRenderObjectWidget {
|
|||||||
}) : transform = new Matrix4.rotationZ(angle),
|
}) : transform = new Matrix4.rotationZ(angle),
|
||||||
super(key: key, child: child);
|
super(key: key, child: child);
|
||||||
|
|
||||||
|
/// Creates a widget that transforms its child using a translation.
|
||||||
|
///
|
||||||
|
/// The `offset` argument must not be null. It specifies the translation.
|
||||||
|
///
|
||||||
|
/// ## Sample code
|
||||||
|
///
|
||||||
|
/// This example shifts the silver-colored child down by fifteen pixels.
|
||||||
|
///
|
||||||
|
/// ```dart
|
||||||
|
/// new Transform.translate(
|
||||||
|
/// offset: const Offset(0.0, 15.0),
|
||||||
|
/// child: new Container(
|
||||||
|
/// padding: const EdgeInsets.all(8.0),
|
||||||
|
/// color: const Color(0xFF7F7F7F),
|
||||||
|
/// child: const Text('Quarter'),
|
||||||
|
/// ),
|
||||||
|
/// )
|
||||||
|
/// ```
|
||||||
|
Transform.translate({
|
||||||
|
Key key,
|
||||||
|
@required Offset offset,
|
||||||
|
this.transformHitTests: true,
|
||||||
|
Widget child,
|
||||||
|
}) : transform = new Matrix4.translationValues(offset.dx, offset.dy, 0.0),
|
||||||
|
origin = null,
|
||||||
|
alignment = null,
|
||||||
|
super(key: key, child: child);
|
||||||
|
|
||||||
|
/// Creates a widget that scales its child uniformly.
|
||||||
|
///
|
||||||
|
/// The `scale` argument must not be null. It gives the scalar by which
|
||||||
|
/// to multiply the `x` and `y` axes.
|
||||||
|
///
|
||||||
|
/// The [alignment] controls the origin of the scale; by default, this is
|
||||||
|
/// the center of the box.
|
||||||
|
///
|
||||||
|
/// ## Sample code
|
||||||
|
///
|
||||||
|
/// This example shrinks an orange box containing text such that each dimension
|
||||||
|
/// is half the size it would otherwise be.
|
||||||
|
///
|
||||||
|
/// ```dart
|
||||||
|
/// new Transform.scale(
|
||||||
|
/// scale: 0.5,
|
||||||
|
/// child: new Container(
|
||||||
|
/// padding: const EdgeInsets.all(8.0),
|
||||||
|
/// color: const Color(0xFFE8581C),
|
||||||
|
/// child: const Text('Bad Ideas'),
|
||||||
|
/// ),
|
||||||
|
/// )
|
||||||
|
/// ```
|
||||||
|
Transform.scale({
|
||||||
|
Key key,
|
||||||
|
@required double scale,
|
||||||
|
this.origin,
|
||||||
|
this.alignment: Alignment.center,
|
||||||
|
this.transformHitTests: true,
|
||||||
|
Widget child,
|
||||||
|
}) : transform = new Matrix4.diagonal3Values(scale, scale, 1.0),
|
||||||
|
super(key: key, child: child);
|
||||||
|
|
||||||
/// The matrix to transform the child by during painting.
|
/// The matrix to transform the child by during painting.
|
||||||
final Matrix4 transform;
|
final Matrix4 transform;
|
||||||
|
|
||||||
@ -1124,6 +1187,10 @@ class FittedBox extends SingleChildRenderObjectWidget {
|
|||||||
///
|
///
|
||||||
/// See also:
|
/// See also:
|
||||||
///
|
///
|
||||||
|
/// * [Transform], which applies an arbitrary transform to its child widget at
|
||||||
|
/// paint time.
|
||||||
|
/// * [new Transform.translate], which applies an absolute offset translation
|
||||||
|
/// transformation instead of an offset scaled to the child.
|
||||||
/// * The [catalog of layout widgets](https://flutter.io/widgets/layout/).
|
/// * The [catalog of layout widgets](https://flutter.io/widgets/layout/).
|
||||||
class FractionalTranslation extends SingleChildRenderObjectWidget {
|
class FractionalTranslation extends SingleChildRenderObjectWidget {
|
||||||
/// Creates a widget that translates its child's painting.
|
/// Creates a widget that translates its child's painting.
|
||||||
@ -1133,7 +1200,7 @@ class FractionalTranslation extends SingleChildRenderObjectWidget {
|
|||||||
Key key,
|
Key key,
|
||||||
@required this.translation,
|
@required this.translation,
|
||||||
this.transformHitTests: true,
|
this.transformHitTests: true,
|
||||||
Widget child
|
Widget child,
|
||||||
}) : assert(translation != null),
|
}) : assert(translation != null),
|
||||||
super(key: key, child: child);
|
super(key: key, child: child);
|
||||||
|
|
||||||
@ -1184,6 +1251,7 @@ class FractionalTranslation extends SingleChildRenderObjectWidget {
|
|||||||
///
|
///
|
||||||
/// * [Transform], which is a paint effect that allows you to apply an
|
/// * [Transform], which is a paint effect that allows you to apply an
|
||||||
/// arbitrary transform to a child.
|
/// arbitrary transform to a child.
|
||||||
|
/// * [new Transform.rotate], which applies a rotation paint effect.
|
||||||
/// * The [catalog of layout widgets](https://flutter.io/widgets/layout/).
|
/// * The [catalog of layout widgets](https://flutter.io/widgets/layout/).
|
||||||
class RotatedBox extends SingleChildRenderObjectWidget {
|
class RotatedBox extends SingleChildRenderObjectWidget {
|
||||||
/// A widget that rotates its child.
|
/// A widget that rotates its child.
|
||||||
|
@ -295,4 +295,42 @@ void main() {
|
|||||||
);
|
);
|
||||||
expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(30.0, 20.0));
|
expect(tester.getTopLeft(find.byType(Placeholder)), const Offset(30.0, 20.0));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('Transform.translate', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
new Transform.translate(
|
||||||
|
offset: const Offset(100.0, 50.0),
|
||||||
|
child: new Opacity(opacity: 0.5, child: new Container()),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// This should not cause a transform layer to be inserted.
|
||||||
|
final List<Layer> layers = tester.layers
|
||||||
|
..retainWhere((Layer layer) => layer is TransformLayer);
|
||||||
|
expect(layers.length, 1); // only the render view
|
||||||
|
expect(tester.getTopLeft(find.byType(Container)), const Offset(100.0, 50.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Transform.scale', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
new Transform.scale(
|
||||||
|
scale: 2.0,
|
||||||
|
child: new Opacity(opacity: 0.5, child: new Container()),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final List<Layer> layers = tester.layers
|
||||||
|
..retainWhere((Layer layer) => layer is TransformLayer);
|
||||||
|
expect(layers.length, 2);
|
||||||
|
// The first transform is from the render view.
|
||||||
|
final TransformLayer layer = layers[1];
|
||||||
|
final Matrix4 transform = layer.transform;
|
||||||
|
expect(transform.storage, <dynamic>[
|
||||||
|
// These are column-major, not row-major.
|
||||||
|
2.0, 0.0, 0.0, 0.0,
|
||||||
|
0.0, 2.0, 0.0, 0.0,
|
||||||
|
0.0, 0.0, 1.0, 0.0,
|
||||||
|
-400.0, -300.0, 0.0, 1.0, // it's 1600x1200, centered in an 800x600 square
|
||||||
|
]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user