Flutterのウェブサイト の指示に従って、シンプルなヒーローアニメーションを作成しました
手順で説明されているように機能しますが、私の場合、最初の画面から2番目の画面までずっとゆっくりとアニメートしたいと思います。このアニメーションの速度を変更する方法を知っている人はいますか?
遷移速度を変更するには、 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,
),
),
),
);
}
}
これを達成する唯一の方法は、PageRoute
遷移時間を変更することによるものではないと思います。 AnimationController
を使用しても同じ効果が得られると思います。この答えは主に Angela Yuの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
は引き続きアクティブです。したがって、バックグラウンドでループするアニメーションがある場合は、画面を変更するときにそれをdisposeすることをお勧めします。これにより、電話のリソースを無駄にしません。それでもう。これは次のようにして達成できます:@override
void dispose() {
controller.dispose();
super.dispose();
}
CurvedAnimation
。を使用することです。controller
の真下でAnimation animation;
を宣言します。controller
の下、initState
内に次の行を追加します:animation = CurvedAnimation( // the controller can't have upperBound > 1
parent: controller, // the controller you created
curve: Curves.decelerate,
);
Flutter
でアニメーション化するもう1つの便利な方法は、TweenAnimationsを使用することです。たとえば、between色に移行する場合は、ColorTween
(controller
の下、initState
):animation = ColorTween(
begin: Colors.red,
end: Colors.blue,
).animate(controller);