Flutter 自定义路由动画案例

前言:

各位同学大家好,最近国庆放假期间因为没有回老家过节(没买到车票啊)就写了一些flutter小案例就分享给大家 (Flutter 自定义路由动画案例),那么废话不多说我们正式开始

准备工作

需要安装flutter的开发环境:大家可以去看看之前的教程:
1 win系统flutter开发环境安装教程: https://www.jianshu.com/p/152447bc8718
2 mac系统flutter开发环境安装教程:https://www.jianshu.com/p/bad2c35b41e3

效果图:

渐变.gif

缩放.gif
旋转加缩放.gif
左右滑动.gif

具体实现 :

渐变路由动画

渐变.gif

首先我们要自定义 一个自定义路由类继承 PageRouteBuilder 然后重写构造方法 需要传入定义一个 Widget变量在构造函数中传入然后我们在spuer 指向父类构造方法的时候添设置一些属性
transitionDuration 和 pageBuilder transitionsBuilder 等属性
然后我们返回 FadeTransition 来实现渐变效果 具体代码

import 'package:flutter/material.dart';
/**
 *
 *  创建人:xuqing
 *  创建时间:2020年10月5日19:06:43
 *  类说明:自定义路由动画效果 渐隐渐变效果
 *
 *
 */

class  GradualChangeRoute extends PageRouteBuilder{
  final Widget widget;
   GradualChangeRoute(this.widget):super(
    transitionDuration:Duration(seconds: 2),
    pageBuilder:(
       BuildContext context,
        Animation<double>animation1,
        Animation<double>animation2,
    ){
      return widget;
    },
       transitionsBuilder:(
     BuildContext context,
      Animation<double>animation1,
      Animation<double>animation2,
       Widget child
    ){
      //渐隐渐变效果
    return FadeTransition(
        opacity: Tween(begin: 0.0,end: 1.0).animate(
          CurvedAnimation(
            parent: animation1,
            curve: Curves.fastOutSlowIn
          )
        ),
        child: child,
      );
    }
  );

}

具体调用 :

Navigator.of(context).push(GradualChangeRoute(SencondPage()));

缩放路由动画

缩放.gif

实现方式类似上面渐变需要自定义路由继承 PageRouteBuilder 只是我们返回的时候 是返回
ScaleTransition 属性来实现缩放路由动画效果 具体代码 :

import 'package:flutter/material.dart';
/**
 *
 *  创建人:xuqing
 *  创建时间:2020年10月5日19:06:43
 *  类说明:自定义路由动画效果 缩放的效果
*
 */
class  ZoomRoute extends PageRouteBuilder{
  final Widget widget;
   ZoomRoute(this.widget):super(
    transitionDuration:Duration(seconds: 2),
    pageBuilder:(
       BuildContext context,
        Animation<double>animation1,
        Animation<double>animation2,
    ){
      return widget;
    },
    transitionsBuilder:(
     BuildContext context,
      Animation<double>animation1,
      Animation<double>animation2,
       Widget child
    ){
       // 缩放的效果
     return ScaleTransition(
        scale: Tween(
            begin: 0.0,end: 1.0).animate(CurvedAnimation(
            parent: animation1,
            curve: Curves.fastOutSlowIn
        )),
        child: child,
      );
     }
  );
}

具体调用:

 Navigator.of(context).push(ZoomRoute(SencondPage()));

旋转加缩放并用路由动画:

旋转加缩放.gif

实现方式类似上面渐变需要自定义路由继承 PageRouteBuilder 只是我们返回的时候 我们先返回 RotationTransition旋转的属性 然后我们在旋转属性组件里面child 里面嵌套 ScaleTransition 缩放属性的组件 最后返回我们的定义的child 具体代码如下

    //旋转加缩放
        return RotationTransition(
           turns: Tween(
             begin: 0.0,end: 1.0
           ).animate(CurvedAnimation(parent: animation1,
               curve: Curves.fastOutSlowIn)),
           child: ScaleTransition(
             scale: Tween(
                 begin: 0.0,end: 1.0).animate(CurvedAnimation(
                 parent: animation1,
                 curve: Curves.fastOutSlowIn
             )),
             child: child,
           ),
         );

完整旋转加缩放路由类代码:

import 'package:flutter/material.dart';
/**
 *
 *  创建人:xuqing
 *  创建时间:2020年10月5日19:06:43
 *  类说明:自定义路由动画效果 旋转加缩放
 */
class  RotateAndZoomRoute extends PageRouteBuilder{
  final Widget widget;
   RotateAndZoomRoute(this.widget):super(
    transitionDuration:Duration(seconds: 2),
    pageBuilder:(
       BuildContext context,
        Animation<double>animation1,
        Animation<double>animation2,
    ){
      return widget;
    },
    transitionsBuilder:(
     BuildContext context,
      Animation<double>animation1,
      Animation<double>animation2,
       Widget child
    ){
       //旋转加缩放
        return RotationTransition(
           turns: Tween(
             begin: 0.0,end: 1.0
           ).animate(CurvedAnimation(parent: animation1,
               curve: Curves.fastOutSlowIn)),
           child: ScaleTransition(
             scale: Tween(
                 begin: 0.0,end: 1.0).animate(CurvedAnimation(
                 parent: animation1,
                 curve: Curves.fastOutSlowIn
             )),
             child: child,
           ),
         );
       }
      );
}

具体调用:

 Navigator.of(context).push(RotateAndZoomRoute(SencondPage()));

左右滑动路由动画 :

左右滑动.gif

实现方式类似上面渐变需要自定义路由继承 PageRouteBuilder 只是我们返回的时候 是返回
SlideTransition属性来实现缩左右滑动路由动画效果 具体代码 :

     //左右滑动路由动画
      return SlideTransition(
          position: Tween<Offset>(
            begin: Offset(-1.0,0.0),
            end:Offset(0.0,0.0),
          ).animate(CurvedAnimation(
            parent: animation1,
            curve: Curves.fastOutSlowIn
          )),
          child: child,
        );

完整左右滑动路由类代码:


import 'package:flutter/material.dart';

/**
 *
 *  创建人:xuqing
 *  创建时间:2020年10月5日19:06:43
 *  类说明:自定义路由动画效果 左右滑动路由动画
*
 *
 */

class  SlidingAroundRoute extends PageRouteBuilder{
  final Widget widget;
   SlidingAroundRoute(this.widget):super(
    transitionDuration:Duration(seconds: 2),
    pageBuilder:(
       BuildContext context,
        Animation<double>animation1,
        Animation<double>animation2,
    ){
      return widget;
    },
    transitionsBuilder:(
     BuildContext context,
      Animation<double>animation1,
      Animation<double>animation2,
       Widget child
    ){
         //左右滑动路由动画
      return SlideTransition(
          position: Tween<Offset>(
            begin: Offset(-1.0,0.0),
            end:Offset(0.0,0.0),
          ).animate(CurvedAnimation(
            parent: animation1,
            curve: Curves.fastOutSlowIn
          )),
          child: child,
        );
       }
      );

}

具体调用:

 Navigator.of(context).push(SlidingAroundRoute(SencondPage()));

到此我们的自定义路由动画就讲完了,当然啦flutter类里面还提供了很多其他的动画属性有兴趣的同学可以自己去多尝试我这边就不展开讲了

最后总结:

flutter里面的路由跳转动画还是比较容易实现的 ,flutter sdk里面已经提供了很多好用的动画属性给我们调用 我们只需要调用互相配合嵌套就能实现很炫的动画交互效果 有兴趣的同学可以多尝试,最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦

项目地址

码云 :https://gitee.com/qiuyu123/customroute_animation

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349