How to use the Transform widget in Flutter

The Transform widget in Flutter allows us to apply various transformations to its child widget, such as rotating, scaling, translating, and skewing. This allows us to create visually appealing and dynamic user interfaces. This answer walks us through the steps of using the Transform widget effectively.

Constructor and parameters

The Transform widget provides a constructor with various parameters to customize its behavior and layout.

const Transform({
  Key? key,
  required Matrix4 transform,
  Offset? origin,
  AlignmentGeometry? alignment,
  bool transformHitTests = true,
  FilterQuality? filterQuality,
  Widget? child
})

Let's take a closer look at each parameter and its purpose.

  • key: An identifier for the widget, allowing Flutter to efficiently manage and update the element tree.

  • transform: Defines the transformation to be applied to the child widget.

  • origin: Specifies the pivot point for transformations, defaulting to the widget's center.

  • alignment: Aligns the child within its bounding box after applying transformations.

  • transformHitTests: Determines whether hit tests consider the original or transformed widget layout.

  • filterQuality: Controls the quality of image filtering applied during transformations.

  • child: The widget to which the transformation is applied.

Implementation

We can follow the instructions given below to add a Transform widget in UI.

Import the necessary packages

To use the Transform widget, we need to import the necessary packages in our Dart file.

import 'package:flutter/material.dart';
import 'dart:math' as math;

Basic syntax of the Transform widget

The Transform widget wraps around a child widget and takes a transform parameter to define the desired transformation. Here's the basic structure:

Transform(
transform: Matrix4.transformation, // Apply your transformation here
child: YourChildWidget(),
)

Applying transformations

There are four fundamental types of transformations:

  • Transform.flip

  • Transform.rotate

  • Transform.scale

  • Transform.translate

Rotating a widget

To rotate a widget, use the rotate method from the Matrix4 class. Specify the angle in radians.

Transform.rotate(
angle: math.pi / 4, // 45 degrees in radians
child: Container(
width: 100,
height: 100,
color: Colors.blue,
child: Center(child: Text('Rotated')),
),
),

After running the above code, we can see the following output:

Rotated containers using Transform.rotate widget
Rotated containers using Transform.rotate widget

Scaling a widget

Use the scale method to scale a widget. Specify the X and Y scaling factors or provide a single scale value that will uniformly scale it on both axes.

Transform.scale(
scale: 1.5,
child: Container(
width: 100,
height: 100,
color: Colors.green,
child: Center(child: Text('Scaled')),
),
),

After running the above code, we can see the following output:

Scaled containers using Transform.scale widget
Scaled containers using Transform.scale widget

Translating a widget

For translating (moving) a widget, utilize the translate method. Specify the X and Y translation values.

Transform.translate(
offset: Offset(50, -20),
child: Container(
width: 100,
height: 100,
color: Colors.orange,
child: Center(child: Text('Translated')),
),
),

After running the above code, we can see the following output:

Translated containers using Transform.translate widget
Translated containers using Transform.translate widget

Skewing a widget

To skew a widget, apply the skew method. Specify the X and Y skew angles in radians.

Transform(
transform: Matrix4.skew(0.3, 0.2),
child: Container(
width: 100,
height: 100,
color: Colors.red,
child: Center(child: Text('Skewed')),
),
),

After running the above code, we can see the following output:

Skewed containers using Matrix4.skew() in transform property of transform widget
Skewed containers using Matrix4.skew() in transform property of transform widget

Code example

We get the following output by putting together the code explained above.

import 'package:flutter/material.dart';
import 'dart:math' as math;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Transform Widget Example',
      home: TransformExample(),
    );
  }
}

class TransformExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Educative Transform Answer')),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              SizedBox(height: 20),
              // Rotating a Widget
              Transform.rotate(
                angle: math.pi / 4,
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.blue,
                  child: Center(child: Text('Rotated')),
                ),
              ),

              SizedBox(height: 20),

              // Scaling a Widget
              Transform.scale(
                scale: 1.5,
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.green,
                  child: Center(child: Text('Scaled')),
                ),
              ),

              SizedBox(height: 20),

              // Translating a Widget
              Transform.translate(
                offset: Offset(50, -20),
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.orange,
                  child: Center(child: Text('Translated')),
                ),
              ),

              SizedBox(height: 10),

              // Skewing a Widget
              Transform(
                transform: Matrix4.skew(0.3, 0.2),
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.red,
                  child: Center(child: Text('Skewed')),
                ),
              ),

              SizedBox(height: 30),

              // Combining Transformations
              Transform(
                transform: Matrix4.rotationX(math.pi / 6)
                  ..scale(1.2)
                  ..translate(20, -10),
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.purple,
                  child: Center(child: Text('Combined')),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Conclusion

The Transform widget in Flutter is a powerful tool for manipulating the appearance of widgets. By mastering its usage, we can create engaging and dynamic user interfaces that respond to user interactions and create visually appealing effects.

Additional resources

You can learn about other Flutter concepts from the following resources:

Free Resources

Copyright ©2024 Educative, Inc. All rights reserved