J'ai fait une animation de héros simple en suivant les instructions de Site Web de Flutter
Cela fonctionne comme décrit dans les instructions mais dans mon cas, je voudrais qu'il s'anime beaucoup plus lentement du premier au deuxième écran. quelqu'un sait-il comment changer la vitesse de cette animation?
Pour modifier la vitesse de transition, vous devrez ajuster la durée de transition PageRoute (comme déjà souligné par @diegoveloper).
Si vous souhaitez conserver la transition par défaut, vous pouvez créer une classe implémentant MaterialPageRoute . Si vous avez déjà votre propre transition ou si vous voulez en créer une, vous pouvez utiliser le PageRouteBuilder pour créer facilement votre propre transition. Ajustez simplement le transitionDuration
.
Voici un petit exemple autonome, utilisant le PageRouteBuilder
:
import 'package:flutter/material.Dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Page1(),
);
}
}
class Page1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
RaisedButton(
child: Text('Page2'),
onPressed: () => Navigator.Push(
context,
PageRouteBuilder(
transitionDuration: Duration(seconds: 2),
pageBuilder: (_, __, ___) => Page2())),
),
Hero(tag: 'home', child: Icon(Icons.home))
],
),
),
);
}
}
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Hero(
tag: 'home',
child: Icon(
Icons.home,
),
),
),
);
}
}
Je ne pense pas que la seule façon d'y parvenir soit de changer la durée de transition de PageRoute
. Je pense que vous pouvez également obtenir le même effet en utilisant un AnimationController
- cette réponse provient en grande partie des conférences # 149 et # 150 de Angela Yu's The Complete 2019 Flutter Development Bootcamp with Dart .
StatefulWidget
.with SingleTickerProviderStateMixin
à votre classe d'état.controller
à l'intérieur de la méthode initState
. duration
, vous pouvez donc la modifier à votre guise.Au final, tout devrait ressembler un peu à ceci:
class _NewScreenState extends State<HomeScreen>
with SingleTickerProviderStateMixin{
AnimationController controller;
@override
void initState() {
super.initState();
controller = AnimationController(
duration: Duration(seconds: 1),
vsync: this,
);
controller.forward();
controller.addListener((){
setState(() {
});
});
}
@override
Widget build(BuildContext context) {
return ...
vsync
est obligatoire (@required
) paramètre qui prend l'objet d'état (instance) lui-même (généralement).addListener
et setState
sont là si vous souhaitez utiliser la valeur de controller
(controller.value
) à un moment donné dans le futur - par exemple, changer la hauteur de l'icône avec quelque chose comme height: finalHeight * controller.value
.FlatButton
avec Navigator.pushNamed
, rien de spécial.controller
sera toujours actif même si vous changez d'écran plus tard. Donc, si vous avez une animation en boucle en arrière-plan, c'est une bonne idée de la supprimer lors du changement d'écran, de cette façon vous ne gaspillez pas les ressources du téléphone avec elle plus. Cela pourrait être réalisé avec: @override
void dispose() {
controller.dispose();
super.dispose();
}
CurvedAnimation
. Animation animation;
juste en dessous de votre controller
.controller
, dans initState
, ajoutez: animation = CurvedAnimation( // the controller can't have upperBound > 1
parent: controller, // the controller you created
curve: Curves.decelerate,
);
Flutter
est d'utiliser TweenAnimations . Par exemple, si vous souhaitez effectuer une transition entre couleurs, vous pouvez utiliser ColorTween
(sous votre controller
, à l'intérieur initState
): animation = ColorTween(
begin: Colors.red,
end: Colors.blue,
).animate(controller);