英文:
How to chain the SlideTransition
问题
I use animation making my widget move.
when I click play button, I want the widget
- move from 1 to 2
- waiting for a few seconds
- move from 2 to 3 and disappear
Now I just completed 1 and have no idea how to achieve 2 and 3
Here is my code in State
.
@override
void initState() {
animationController = AnimationController(duration: widget.duration, vsync: this);
animation = Tween(
begin: const Offset(1.0, 0),
end: const Offset(0.0, 0)
).animate(animationController);
animationController.forward();
super.initState();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
},
child: SlideTransition(
position: animation,
child: getBarrageWidget(),//can be any widget, not important.
),
);
}
Any help will be appreciated.
英文:
I use animation making my widget move.
when I click play button, I want the widget
- move from 1 to 2
- waiting for few seconds
- move from 2 to 3 and disappear
Now I just complete 1 and have no idea how to achieve 2 and 3
Here is my code in State
.
@override
void initState() {
animationController = AnimationController(duration: widget.duration, vsync: this);
animation = Tween(
begin: const Offset(1.0, 0),
end: const Offset(0.0, 0)
).animate(animationController);
animationController.forward();
super.initState();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
},
child: SlideTransition(
position: animation,
child: getBarrageWidget(),//can be any widget, not important.
),
);
}
Any help will be appreciate.
答案1
得分: 0
在Flutter中没有提供预置的动画管理器,所以你需要自己管理动画。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key});
@override
Widget build(BuildContext context) {
return OrientationBuilder(
builder: (context, orientation) {
return const MaterialApp(
title: 'Demo',
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
},
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
late AnimationController _animationController;
late AnimationController _animationController2;
late AnimationController _animationController3;
late Animation<Offset> _animation;
late Animation<Offset> _animation2;
late Animation<Offset> _animation3;
late Animation<Offset> _animation4;
late Animation<double> _fadeAnimation;
bool isFirstAnimationCompleted = false;
bool isSecondAnimationCompleted = false;
bool isAnimating = false;
@override
void initState() {
super.initState();
_animationController = AnimationController(
vsync: this,
duration: const Duration(seconds: 3),
);
_animationController = AnimationController(
vsync: this,
duration: const Duration(seconds: 3),
);
_animationController.addStatusListener((status) {
if (status == AnimationStatus.completed) {
Future.delayed(const Duration(seconds: 3), () {
_animationController2.forward();
});
isFirstAnimationCompleted = true;
setState(() {});
}
});
_animationController2 = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
);
_animationController2.addStatusListener((status) {
if (status == AnimationStatus.completed) {
isSecondAnimationCompleted = true;
Future.delayed(const Duration(milliseconds: 500), () {
setState(() {});
_animationController3.forward();
});
}
});
_animation = Tween(begin: const Offset(-1.0, 0), end: const Offset(1.0, 0))
.animate(_animationController);
_animation2 = Tween(begin: const Offset(-2.0, 0), end: const Offset(0.0, 0))
.animate(_animationController);
_animation3 = Tween(begin: const Offset(0.0, 0), end: const Offset(1.0, 0))
.animate(_animationController2);
_animation4 = Tween(begin: const Offset(-1.0, 0), end: const Offset(0.0, 0))
.animate(_animationController2);
_animationController3 = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 500),
);
_fadeAnimation =
Tween<double>(begin: 1.0, end: 0.0).animate(_animationController3);
}
@override
void dispose() {
_animationController.dispose();
_animationController2.dispose();
_animationController3.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final child = Stack(
children: [
SlideTransition(
position: _animation,
child: Container(
color: Colors.green,
width: double.infinity,
height: 400,
child: const Center(
child: Text(
'Hello World',
style: TextStyle(fontSize: 42),
),
),
),
),
SlideTransition(
position: !isFirstAnimationCompleted ? _animation2 : _animation3,
child: Container(
color: Colors.orange,
width: double.infinity,
height: 400,
child: const Center(
child: Text(
'Hello World Again',
style: TextStyle(fontSize: 42),
),
),
),
),
if (isFirstAnimationCompleted)
SlideTransition(
position: _animation4,
child: Container(
color: Colors.red,
width: double.infinity,
height: 400,
child: const Center(
child: Text(
'Hello World Third Time',
style: TextStyle(fontSize: 42),
),
),
),
),
],
);
return Scaffold(
appBar: AppBar(),
body: isFirstAnimationCompleted && isSecondAnimationCompleted
? FadeTransition(
opacity: _fadeAnimation,
child: child,
)
: child,
floatingActionButton: FloatingActionButton(
onPressed: _animationController.forward,
child: const Icon(
Icons.play_arrow,
),
),
);
}
}
英文:
There is no animator set in flutter so you will have to manage the animation yourself.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return OrientationBuilder(
builder: (context, orientation) {
return const MaterialApp(
title: 'Demo',
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
},
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
late AnimationController _animationController;
late AnimationController _animationController2;
late AnimationController _animationController3;
late Animation<Offset> _animation;
late Animation<Offset> _animation2;
late Animation<Offset> _animation3;
late Animation<Offset> _animation4;
late Animation<double> _fadeAnimation;
bool isFirstAnimationCompleted = false;
bool isSecondAnimationCompleted = false;
bool isAnimating = false;
@override
void initState() {
super.initState();
_animationController = AnimationController(
vsync: this,
duration: const Duration(seconds: 3),
);
_animationController = AnimationController(
vsync: this,
duration: const Duration(seconds: 3),
);
_animationController.addStatusListener((status) {
if (status == AnimationStatus.completed) {
Future.delayed(const Duration(seconds: 3), () {
_animationController2.forward();
});
isFirstAnimationCompleted = true;
setState(() {});
}
});
_animationController2 = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
);
_animationController2.addStatusListener((status) {
if (status == AnimationStatus.completed) {
isSecondAnimationCompleted = true;
Future.delayed(const Duration(milliseconds: 500), () {
setState(() {});
_animationController3.forward();
});
}
});
_animation = Tween(begin: const Offset(-1.0, 0), end: const Offset(1.0, 0))
.animate(_animationController);
_animation2 = Tween(begin: const Offset(-2.0, 0), end: const Offset(0.0, 0))
.animate(_animationController);
_animation3 = Tween(begin: const Offset(0.0, 0), end: const Offset(1.0, 0))
.animate(_animationController2);
_animation4 = Tween(begin: const Offset(-1.0, 0), end: const Offset(0.0, 0))
.animate(_animationController2);
_animationController3 = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 500),
);
_fadeAnimation =
Tween<double>(begin: 1.0, end: 0.0).animate(_animationController3);
}
@override
void dispose() {
_animationController.dispose();
_animationController2.dispose();
_animationController3.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final child = Stack(
children: [
SlideTransition(
position: _animation,
child: Container(
color: Colors.green,
width: double.infinity,
height: 400,
child: const Center(
child: Text(
'Hello World',
style: TextStyle(fontSize: 42),
),
),
),
),
SlideTransition(
position: !isFirstAnimationCompleted ? _animation2 : _animation3,
child: Container(
color: Colors.orange,
width: double.infinity,
height: 400,
child: const Center(
child: Text(
'Hello World Again',
style: TextStyle(fontSize: 42),
),
),
),
),
if (isFirstAnimationCompleted)
SlideTransition(
position: _animation4,
child: Container(
color: Colors.red,
width: double.infinity,
height: 400,
child: const Center(
child: Text(
'Hello World Third Time',
style: TextStyle(fontSize: 42),
),
),
),
),
],
);
return Scaffold(
appBar: AppBar(),
body: isFirstAnimationCompleted && isSecondAnimationCompleted
? FadeTransition(
opacity: _fadeAnimation,
child: child,
)
: child,
floatingActionButton: FloatingActionButton(
onPressed: _animationController.forward,
child: const Icon(
Icons.play_arrow,
),
),
);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论