美文网首页Flutter圈子Flutter 入门与实战
超人飞来!满屏的力量感动画!

超人飞来!满屏的力量感动画!

作者: 岛上码农 | 来源:发表于2022-04-26 19:36 被阅读0次

前言

继续 Transition 系列动画组件的介绍,本篇来介绍 SizeTransitionSizeTransition 用于更改子组件的尺寸来实现动画。支持垂直方向或水平方向修改动画,同时尺寸更改的起始位置可以从顶部、中部、底部(垂直方向)或左侧、中间、右侧(水平方向)开始。通过这写特性,我们可以构建组件飞入的效果。

超人飞来.gif

SizeTransition 介绍

SizeTransition 的构造方法定义如下。

const SizeTransition({
  Key? key,
  this.axis = Axis.vertical,
  required Animation<double> sizeFactor,
  this.axisAlignment = 0.0,
  this.child,
}) 

参数对应的说明如下:

  • axis:枚举,vertical 标识纵向更改组件尺寸,即更改组件高度;horizontal 表示横向更改组件尺寸,即更改组件宽度。
  • sizeFactor:即控制组件尺寸变化的 Animation 对象。实际上在动画过程中就是组件尺寸的宽度(horizontal)或高度(vertical)乘以Animation<double>的值。
  • axisAlignment:即动画过程中,子组件的对齐位置,默认为0.0,是从中间开始更改尺寸;当axisvertical时,-1.0代表顶部对齐开始动画(即尺寸从上到下开始变大);当 axishorizontal 时,开始的方向和文本的反向有关(TextDirection.ltr 还是 TextDirection.rtl),当文本为从左到右时(TextDirection.ltr,默认),-1.0表示从左侧开始动画(即尺寸从左到右开始变大)。

应用

对于我们的飞入动画来说,我们要实现从左向右飞入动画效果,因此需要设置 axis 为水平方向,然后 axisAligment 为右侧。对于图片,找一个横向飞行的超人,然后加上动画后就可以实现超人飞入的效果了。完整源码如下:

class SizeTransitionDemo extends StatefulWidget {
  SizeTransitionDemo({Key? key}) : super(key: key);

  @override
  _SizeTransitionDemoState createState() => _SizeTransitionDemoState();
}

class _SizeTransitionDemoState extends State<SizeTransitionDemo>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller =
      AnimationController(duration: const Duration(seconds: 3), vsync: this)
        ..repeat();

  //使用自定义曲线动画过渡效果
  late Animation<double> _animation = CurvedAnimation(
      parent: _controller, curve: Curves.fastLinearToSlowEaseIn);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SizeTransition'),
        brightness: Brightness.dark,
        backgroundColor: Colors.blue,
      ),
      body: SizeTransition(
        child: Center(
          child: Image.asset(
            'images/superman.png',
            width: 300.0,
            height: 300.0,
          ),
        ),
        sizeFactor: _animation,
        axis: Axis.horizontal,
        axisAlignment: 1.0,
      ),
    );
  }

  @override
  void dispose() {
    _controller.stop();
    _controller.dispose();
    super.dispose();
  }
}

使用 SizeTransition 实现其他动画效果

我们可以设置动画从中间开始,这样会有一种卷轴打开的效果,比如我们找一幅卷轴画来看看效果。


卷轴打开动效.gif

这个动画的实现代码如下:

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('SizeTransition'),
      brightness: Brightness.dark,
      backgroundColor: Colors.blue,
    ),
    body: Container(
      alignment: Alignment.center,
      child: SizeTransition(
        child: Image.asset(
          'images/juanzhou.png',
        ),
        sizeFactor: _animation,
        axis: Axis.horizontal,
        axisAlignment: 0.0,
      ),
    ),
  );
}

总结

本篇介绍了使用 SizeTransition 控制组件尺寸更改来实现飞入或展开的动画效果。SizeTransition 也可以用于那种滑入滑出的动画场合,比如列表元素的插入使用下滑入,列表元素的删除使用上滑出。

相关文章

  • 超人飞来!满屏的力量感动画!

    前言 继续 Transition 系列动画组件的介绍,本篇来介绍 SizeTransition。SizeTrans...

  • 动画鉴赏——一拳超人

    动画鉴赏——一拳超人 ...

  • 超人总动员

    《超人总动员》是一部皮克斯动画工作室制作的动画电影,于2004年11月5日美国上映,影片主要讲述了伟大的超人...

  • 萌言趣语奇思妙想

    文/十月云 (一)小超人 背景介绍:W——技术高手,前辈。 我:发明了一个小超人表情 迎面飞来 ~(O.O)~ W...

  • 陈超人

    儿子让我叫他陈超人。 也许是看了太多关于超人英雄之类的动画片,有一段时间,儿子让我们喊他陈超人。对于小...

  • 两不厌(二六)

    (深夜,我们在聊天) 我:《超人总动员》里的人设真的很契合家庭对父母角色的要求。比如,强调父亲的“力量感”,所以爸...

  • 有爸爸?!没爸爸!

    一、超人美女妈妈 五一到了,朋友圈里纷纷开启了假期模式,满屏各种旅游、Shopping、话剧、美酒、日料…...

  • Transisition 动画,多种思路

    思路一: Transisition 动画 , 点击哪里,从那里弹出,铺满屏幕, 取代 Ctrl 的modal 模态...

  • 其实超人就在你身边,6.22电影日历打卡

    在2004年动画电影《超人总动员》的出现,在超级英雄还未泛滥的市场,激起人们狂热的追捧。原来超人不但会有家庭,还会...

  • DC动画电影《超人王朝》首款预告

    DC动画电影《超人之死》前不久刚推出,片中还有不少有趣的镜头供粉丝欣赏。 而现在,官方放出了其后续内容——《超人王...

网友评论

    本文标题:超人飞来!满屏的力量感动画!

    本文链接:https://www.haomeiwen.com/subject/cmshyrtx.html