How do I rotate (and possible animate) an image on an arbitrary point inside the image?

后端 未结 1 850
一向
一向 2021-02-13 13:56

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

相关标签:
1条回答
  • 2021-02-13 14:47

    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.

    0 讨论(0)
提交回复
热议问题