Flutter 二元动画颤振

Flutter 二元动画颤振,flutter,dart,Flutter,Dart,我想在单击按钮时播放动画。在第一次按下时,小部件旋转180度,在第二次按下时,小部件再旋转180度(即,它返回到其原始位置)。我该怎么做 模拟手势检测器按钮 Expanded( child: GestureDetector( onTap: () => setState(() { if (tap

我想在单击按钮时播放动画。在第一次按下时,小部件旋转180度,在第二次按下时,小部件再旋转180度(即,它返回到其原始位置)。我该怎么做

模拟手势检测器按钮

                      Expanded(
                        child: GestureDetector(
                          onTap: () => setState(() {
                            if (tapValue == 0) {
                              tapValue++;
                              animController.forward();
                              beginValue = 0.0;
                              endValue = 0.5;
                            } else {
                              tapValue--;
                              animController.forward();
                            }
                          }),
                          child: Container(
                            child: Image.asset('assets/images/enableAsset.png'),
                          ),
                        ),
                      ),
我要旋转的小部件

            child: CustomPaint (
              painter: SmileyPainter(),
              child: RotationTransition(
                turns: Tween(begin: beginValue, end: endValue,).animate(animController),
                child: CustomPaint (
                  painter: Smile(),
                ),
              ),
            )
动画控制器

  @override
  void initState() {
    animController = AnimationController(
      duration: const Duration(milliseconds: 400),
      vsync: this,
    );
    super.initState();
  }
替换

else {tapValue--;
      animController.forward();
}


如果您想要实现的只是旋转一个小部件,我建议您避免使用控制器。这不仅可以简化您的代码,还可以节省处理代码的繁琐工作

我逐渐意识到,使用
TweenAnimationBuilder
小部件几乎可以避免任何控制器

下面是一个如何使其适用于您的案例的示例:

Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _rotationAngle += pi;
          print(_rotationAngle);
          setState(() {

          });
        },
      ),
      body: Center(
        child: TweenAnimationBuilder(
          duration: Duration(milliseconds: 300),
          tween: Tween<double>(begin: 0, end: _rotationAngle),
          builder: (BuildContext context, double value, Widget child) {
            return Transform.rotate(
              angle: value,
              child: child,
            );
          },
          child: Container(
            height: 500,
            width: 50,
            color: Colors.redAccent,
          ),
        ),
      ),
    );
脚手架(
浮动操作按钮:浮动操作按钮(
已按下:(){
_旋转角度+=π;
打印(旋转角度);
设置状态(){
});
},
),
正文:中(
孩子:TweeAnimationBuilder(
持续时间:持续时间(毫秒:300),
吐温:吐温(开始:0,结束:旋转角度),
生成器:(BuildContext上下文,双值,小部件子项){
返回Transform.rotate(
角度:值,
孩子:孩子,
);
},
子:容器(
身高:500,
宽度:50,
颜色:Colors.redAccent,
),
),
),
);
Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _rotationAngle += pi;
          print(_rotationAngle);
          setState(() {

          });
        },
      ),
      body: Center(
        child: TweenAnimationBuilder(
          duration: Duration(milliseconds: 300),
          tween: Tween<double>(begin: 0, end: _rotationAngle),
          builder: (BuildContext context, double value, Widget child) {
            return Transform.rotate(
              angle: value,
              child: child,
            );
          },
          child: Container(
            height: 500,
            width: 50,
            color: Colors.redAccent,
          ),
        ),
      ),
    );