gpt4 book ai didi

flutter - 单击 flutter 后使小部件旋转 90 度

转载 作者:IT王子 更新时间:2023-10-29 07:09:02 27 4
gpt4 key购买 nike

我想用flutter代码让图片在点击后旋转90度。

点击第一个和第四个,它与动画效果效果很好但是

点击2号和3号,旋转无动画效果。 <<<-- 这是问题。我希望它旋转时带有动画效果。

我尝试了一些其他的实现方式,但没有用。

谁能帮我解释一下哪里出了问题?

我使用的代码如下:

import 'dart:math';    
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
AnimationController animationController1;
AnimationController animationController2;
AnimationController animationController3;
AnimationController animationController4;
Animation<double> animation1;
Animation<double> animation2;
Animation<double> animation3;
Animation<double> animation4;
int rotateTime = 0;
@override
void initState() {
animationController1 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animationController2 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animationController3 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animationController4 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animation1 =
Tween<double>(begin: 0, end: pi / 2).animate(animationController1);
animation2 =
Tween<double>(begin: pi / 2, end: pi).animate(animationController2);
animation3 =
Tween<double>(begin: pi, end: -pi / 2).animate(animationController3);
animation4 =
Tween<double>(begin: -pi / 2, end: 0).animate(animationController4);
super.initState();
}
@override
void dispose() {
super.dispose();
animationController1?.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Container(
child: GestureDetector(
onTap: _rotateChildContinuously,
child:
RotateTrans(Image.asset('images/smile.png'), buildAnimation())),
),
);
}
_rotateChildContinuously() {
print(rotateTime);
setState(() {
rotateTime++;
if (rotateTime == 1) {
animationController1.forward(from: 0);
} else if (rotateTime == 2) {
animationController2.forward(from: pi / 2);
} else if (rotateTime == 3) {
animationController3.forward(from: pi);
} else if (rotateTime == 4) {
animationController4.forward(from: -pi / 2);
}

});
}
Animation buildAnimation() {
if (rotateTime == 1 || rotateTime == 0) {
return animation1;
} else if (rotateTime == 2) {
return animation2;
} else if (rotateTime == 3) {
return animation3;
} else if (rotateTime == 4) {
rotateTime = 0;
return animation4;
}
}
}
class RotateTrans extends StatelessWidget {
final Widget child;
final Animation<double> animation;
RotateTrans(this.child, this.animation);
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: animation,
child: child,
builder: (context, child) {
return Container(
child: Transform.rotate(
angle: animation.value,
child: Container(
child: child,
),
),
);
},
);
}
}

感谢您的宝贵时间!

最佳答案

  1. 改变 forward(from:0) 或只是没有 from 参数的 animationControllerX.forward()

    if (rotateTime == 1) {
    animationController1.forward(from:0);
    } else if (rotateTime == 2) {
    animationController2.forward(from:0);
    } else if (rotateTime == 3) {
    animationController3.forward(from:0);
    } else if (rotateTime == 4) {
    animationController4.forward(from:0);
    }
  2. 改变动画公式

        animation1 =
    Tween<double>(begin: 0, end: pi / 2).animate(animationController1);
    animation2 =
    Tween<double>(begin: pi / 2, end: pi).animate(animationController2);
    animation3 =
    Tween<double>(begin: pi, end: pi + pi/2).animate(animationController3);
    animation4 =
    Tween<double>(begin: pi + pi/2, end: pi + pi).animate(animationController4);

完整代码

import 'dart:math';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
AnimationController animationController1;
AnimationController animationController2;
AnimationController animationController3;
AnimationController animationController4;
Animation<double> animation1;
Animation<double> animation2;
Animation<double> animation3;
Animation<double> animation4;
int rotateTime = 0;

@override
void initState() {
animationController1 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animationController2 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animationController3 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animationController4 =
AnimationController(vsync: this, duration: Duration(milliseconds: 500));
animation1 =
Tween<double>(begin: 0, end: pi / 2).animate(animationController1);
animation2 =
Tween<double>(begin: pi / 2, end: pi).animate(animationController2);
animation3 =
Tween<double>(begin: pi, end: pi + pi/2).animate(animationController3);
animation4 =
Tween<double>(begin: pi + pi/2, end: pi + pi).animate(animationController4);
super.initState();
}
@override
void dispose() {
super.dispose();
animationController1?.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Container(
child: GestureDetector(
onTap: _rotateChildContinuously,
child:
RotateTrans(Image.asset('assets/images/smile.png'), buildAnimation())),
),
);
}
_rotateChildContinuously() {
print(rotateTime);
setState(() {
rotateTime++;
if (rotateTime == 1) {
animationController1.forward(from:0);
} else if (rotateTime == 2) {
animationController2.forward(from:0);
} else if (rotateTime == 3) {
animationController3.forward(from:0);
} else if (rotateTime == 4) {
animationController4.forward(from:0);
}

});
}
Animation buildAnimation() {
if (rotateTime == 1 || rotateTime == 0) {
return animation1;
} else if (rotateTime == 2) {
return animation2;
} else if (rotateTime == 3) {
return animation3;
} else if (rotateTime == 4) {
rotateTime = 0;
return animation4;
}
}
}
class RotateTrans extends StatelessWidget {
final Widget child;
final Animation<double> animation;
RotateTrans(this.child, this.animation);
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: animation,
child: child,
builder: (context, child) {
return Container(
child: Transform.rotate(
angle: animation.value,
child: Container(
child: child,
),
),
);
},
);
}
}

enter image description here

关于flutter - 单击 flutter 后使小部件旋转 90 度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com