首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用颤振AnimationController旋转图像并进行变换?

如何使用颤振AnimationController旋转图像并进行变换?
EN

Stack Overflow用户
提问于 2018-12-12 14:47:13
回答 8查看 61.1K关注 0票数 46

我有星png图像,我需要旋转的恒星使用颤振AnimationController和变压器。我找不到任何文档或图像旋转动画的例子。

知道如何使用颤振AnimationController旋转图像并进行转换吗?

更新:

代码语言:javascript
复制
class _MyHomePageState extends State<MyHomePage>  with TickerProviderStateMixin {

  AnimationController animationController;

  @override
  void initState() {
    super.initState();
    animationController = new AnimationController(
      vsync: this,
      duration: new Duration(milliseconds: 5000),
    );
    animationController.forward();
    animationController.addListener(() {
      setState(() {
        if (animationController.status == AnimationStatus.completed) {
          animationController.repeat();
        }
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      alignment: Alignment.center,
      color: Colors.white,
      child: new AnimatedBuilder(
        animation: animationController,
        child: new Container(
          height: 80.0,
          width: 80.0,
          child: new Image.asset('images/StarLogo.png'),
        ),
        builder: (BuildContext context, Widget _widget) {
          return new Transform.rotate(
            angle: animationController.value,
            child: _widget,
          );
        },
      ),
    );
  }
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-12-12 14:55:26

这是我的旋转图像的例子。我不知道-但也许它适合你

代码语言:javascript
复制
AnimationController rotationController;

@override
void initState() {
  rotationController = AnimationController(duration: const Duration(milliseconds: 500), vsync: this);
  super.initState();
}
//...
RotationTransition(
  turns: Tween(begin: 0.0, end: 1.0).animate(rotationController),
  child: ImgButton(...)
//...
rotationController.forward(from: 0.0); // it starts the animation

如何用Transform.rotate解决UPD问题

在您的示例中,所有操作都与您编写的完全相同--它将图像从0.0旋转到1.0 (这是AnimationController的默认参数)。对于完整的圆,您必须将上参数设置为2* pi (来自math包)

代码语言:javascript
复制
import 'dart:math';
//...
animationController = AnimationController(vsync: this, duration: Duration(seconds: 5), upperBound: pi * 2);
票数 40
EN

Stack Overflow用户

发布于 2019-03-26 17:49:20

完整示例(null安全):

按下"go“键会使星星图标旋转,直到你按下”停止“。

代码语言:javascript
复制
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    _controller = AnimationController(
      duration: const Duration(milliseconds: 5000),
      vsync: this,
    );
    super.initState();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Demo"),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            RotationTransition(
              turns: Tween(begin: 0.0, end: 1.0).animate(_controller),
              child: Icon(Icons.stars),
            ),
            ElevatedButton(
              child: Text("go"),
              onPressed: () => _controller.forward(),
            ),
            ElevatedButton(
              child: Text("reset"),
              onPressed: () => _controller.reset(),
            ),
          ],
        ),
      ),
    );
  }
}

逐步指南:

首先,让您的小部件状态类实现SingleTickerProviderStateMixin

其次,定义一个AnimationController,不要忘记释放它。如果您尚未使用空安全,请删除late关键字.

代码语言:javascript
复制
late AnimationController _controller;

@override
void initState() {
  _controller = AnimationController(
    duration: const Duration(milliseconds: 5000),
    vsync: this,
  );
  super.initState();
}

@override
void dispose() {
  _controller.dispose();
  super.dispose();
}

然后用RotationTransition包装您的RotationTransition

代码语言:javascript
复制
RotationTransition(
  turns: Tween(begin: 0.0, end: 1.0).animate(_controller),
  child: Icon(Icons.stars),
),

最后,调用AnimationController上的方法启动/停止动画。

  • 运行动画一次,使用.forward
  • 循环动画,使用.repeat
  • 立即停止,使用.stop
  • 停止并将其设置为原始旋转,使用.reset
  • 停止并动画到旋转值,使用.animateTo
票数 58
EN

Stack Overflow用户

发布于 2020-05-15 12:25:01

截屏(Null Safe)

完整代码:

代码语言:javascript
复制
import 'dart:math' as math;

class _FooPageState extends State<FooPage> with SingleTickerProviderStateMixin{
  late final AnimationController _controller = AnimationController(vsync: this, duration: Duration(seconds: 2))..repeat();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          builder: (_, child) {
            return Transform.rotate(
              angle: _controller.value * 2 * math.pi,
              child: child,
            );
          },
          child: FlutterLogo(size: 200),
        ),
      ),
    );
  }
}
票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53745546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档