过场动画也就是切换路由时的动画android
这个东西有几种方案能够作git
PageRoute
来作, 复写 5 个抽象方法, 并抽象buildTransitions
PageTransitionsTheme
类结合 MaterialApp 的 theme 的pageTransitionsTheme
属性前两种目前网络上也有一些人作了分享, 但第三种好像不多有人使用, 我这里就来讲一下PageTransitionsTheme
的用法github
这东西有以下的好处:网络
MaterialPageRoute
均可以生效pushNamed
体系的也有效为啥分析源码? 由于若是上来就用显得不高端app
先找一个你们都知道的切入点, 通常的过场动画都是用的 Navigator.push
方法来实现的less
看看方法里的实现, 会发现不少常见的东西, 好比, 每个 Route 都有本身的 OverlayEntryide
而后会有一个 install 方法post
而实际调用中, 这个 Overlay 会被插入到 Overlay 栈内, 从而在界面上显示动画
通过这一串的调用, 就把 Navigator push 和 Route 关联到了一块儿, 那么 theme 是怎么和 Route 关联起来的呢, 咱们进入 MaterialPageRoute 看一下ui
咱们看到, 这里是从 Theme 中找到 pageTransitionsTheme, 而后调用 pageTransitionsTheme 的 buildTransitions 方法来完成构建, 因此这就是咱们能够在 theme 中一次修改, 多处生效的主因了
前面查看到了源码是如何关联到 pageTransitionsTheme
属性的, 咱们接着就是该自定义的时候了
修改本身的 MyApp, 修改pageTransitionsTheme
属性
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
pageTransitionsTheme: PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.iOS: createTransition(),
TargetPlatform.android: createTransition(),
},
),
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
复制代码
PageTransitionsBuilder createTransition() {
return FadeUpwardsPageTransitionsBuilder();
}
复制代码
效果以下:
根据注释, sdk 中有以下几种动画
其中FadeUpwardsPageTransitionsBuilder
对应安卓默认的, PageTransitionsBuilder
天然是对应的 iOS
ZoomPageTransitionsBuilder:
OpenUpwardsPageTransitionsBuilder:
除了已有的, 咱们还能够自定义动画, 能够配合 animation组件来完成酷炫的动画效果, 具体的能够查看官网动画部分介绍
自定义 MyPageTransitionsBuilder
import 'package:flutter/material.dart';
PageTransitionsBuilder createTransition() {
// return FadeUpwardsPageTransitionsBuilder();
// return OpenUpwardsPageTransitionsBuilder();
// return ZoomPageTransitionsBuilder();
return MyPageTransitionsBuilder();
}
class MyPageTransitionsBuilder extends PageTransitionsBuilder {
@override
Widget buildTransitions<T>(
PageRoute<T> route,
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child) {
return ScaleTransition(
scale: animation,
child: RotationTransition(
turns: animation,
child: child,
),
);
}
}
复制代码
效果以下
有问题请在本人博客下留言(github 登录便可)