I'm using Flutter, and I'd like an image to rotate on a point I define. For example, I'd like the image to animate the rotation (swing down) on its upper right corner. How do I do this?
To create a rotating animation in CSS, use the animation property and set the value of animations like duration, direction, and speed. Moreover, the rotate() CSS function is being used to rotate an element circularly in the transform property.
With your image open in Photoshop, go to Image > Image Rotation. 2. Select from the image rotation options — 90 degrees clockwise, 90 degrees counterclockwise, or 180 degrees.
Here is a solution that uses the FractionalOffset
class to specify the point to rotate around.
If you don't want to animate, Transform
does what you want.
return new Transform(
transform: new Matrix4.rotationZ(math.PI),
alignment: FractionalOffset.bottomRight,
child: child,
);
If you do want to animate, RotationTransition
almost does what you want, except the alignment isn't configurable. You can make your own version that is configurable:
import 'dart:ui';
import 'dart:math' as math;
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: "Rotation Demo",
home: new RotateDemo(),
));
}
/// Animates the rotation of a widget around a pivot point.
class PivotTransition extends AnimatedWidget {
/// Creates a rotation transition.
///
/// The [turns] argument must not be null.
PivotTransition({
Key key,
this.alignment: FractionalOffset.center,
@required Animation<double> turns,
this.child,
}) : super(key: key, listenable: turns);
/// The animation that controls the rotation of the child.
///
/// If the current value of the turns animation is v, the child will be
/// rotated v * 2 * pi radians before being painted.
Animation<double> get turns => listenable;
/// The pivot point to rotate around.
final FractionalOffset alignment;
/// The widget below this widget in the tree.
final Widget child;
@override
Widget build(BuildContext context) {
final double turnsValue = turns.value;
final Matrix4 transform = new Matrix4.rotationZ(turnsValue * math.PI * 2.0);
return new Transform(
transform: transform,
alignment: alignment,
child: child,
);
}
}
class RotateDemo extends StatefulWidget {
State createState() => new RotateDemoState();
}
class RotateDemoState extends State<RotateDemo> with TickerProviderStateMixin {
AnimationController _animationController;
@override initState() {
super.initState();
_animationController = new AnimationController(
duration: const Duration(milliseconds: 3000),
vsync: this,
)..repeat();
}
@override dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body:
new Center(
child: new PivotTransition(
turns: _animationController,
alignment: FractionalOffset.bottomRight,
child: new Container(
decoration: new BoxDecoration(backgroundColor: Colors.grey.shade200),
width: 100.0,
child: new FlutterLogo(style: FlutterLogoStyle.horizontal),
),
),
),
);
}
}
This example rotates the Flutter logo around it's bottom right corner.
If you're feeling adventurous, you could send Flutter a pull request to make the RotationTransition
's alignment configurable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With