它可以按照说明中的说明工作,但就我而言,我希望它从第一个屏幕到第二个屏幕的动画制作速度要慢得多。有谁知道如何更改此动画的速度?
答案 0 :(得分:1)
要修改过渡速度,您必须调整PageRoute过渡持续时间(如@diegoveloper所指出)。
如果要保留默认过渡,可以创建一个实现MaterialPageRoute的类。如果您已经拥有自己的过渡或想要创建一个过渡,则可以使用PageRouteBuilder来轻松构建自己的过渡。只需调整transitionDuration
。
这是一个小的独立示例,使用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,
),
),
),
);
}
}
答案 1 :(得分:0)
我认为实现这一目标的唯一方法不是通过更改PageRoute
过渡持续时间。我认为您也可以通过使用AnimationController
来达到相同的效果-这个答案主要来自Angela Yu's The Complete 2019 Flutter Development Bootcamp with Dart的第149号和第150号讲座。
StatefulWidget
。with SingleTickerProviderStateMixin
添加到状态类。controller
方法内使用initState
。
duration
的属性,因此您可以根据自己的喜好更改它。最后,一切应该看起来像这样:
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
是必需的(@required
)参数,它通常使用状态(实例)对象本身。addListener
(setState
)的值,例如更改高度,可以使用controller
和controller.value
图标上带有类似height: finalHeight * controller.value
的内容。FlatButton
与Navigator.pushNamed
一起使用,没什么特别的。controller
仍将处于活动状态。因此,如果您在后台有一个循环的动画,则最好在更改屏幕时处置它,这样您就不会再浪费电话资源了。这可以通过以下方式实现:
@override
void dispose() {
controller.dispose();
super.dispose();
}
CurvedAnimation
。
Animation animation;
下方声明controller
。controller
下方的initState
下方,添加:
animation = CurvedAnimation( // the controller can't have upperBound > 1
parent: controller, // the controller you created
curve: Curves.decelerate,
);
Flutter
中进行动画制作的另一种有用方法是使用 TweenAnimations 。例如,如果要在颜色之间切换,可以使用ColorTween
(在controller
下方initState
内):
animation = ColorTween(
begin: Colors.red,
end: Colors.blue,
).animate(controller);