flutter 动画系列 旋转动画,波浪动画,向外扩散的圆动画,平移动画,缩小变大动画

动画效果.gif

3个动画,组合成这样的,一个一个来.

  • 首先是旋转动画
    本身flutter就带一个旋转的动画组件RotationTransition,使用的时候就是传入一个AnimationController就可以了,
    repeat()就是循环播放的意思.
  late AnimationController _rotationController;
  @override
  void initState() {
    super.initState();
    _rotationController = AnimationController(
      duration: const Duration(seconds: 6),
      vsync: this,
    )..repeat();
  }
  
//在build里
  RotationTransition(
      turns: _rotationController,
      child: Container(),
  ),
  • 波浪的动画
    这个是在网上借鉴的,在网上找到的是波浪的动画,实际上我们需要的是一个圆线向外扩展,不是波浪,改一改就达到效果了.水波纹的被我注释掉了,想用的自己把注释解开,把我用的注释活删掉都行.
_linController 动画控制器
调用:
AnimatedBuilder(
    animation: _linController,
    builder: (context, child) {
       return CustomPaint(
        painter: WaterRipplePainter(
        _linController.value,
        count: 1,
        ),
      );
    },
 ),

class WaterRipplePainter extends CustomPainter {
  final double progress;
  final int count;  //有几条线,如果是要用波纹的情况下,给2到3个显示效果最佳
  final Color color;

  WaterRipplePainter(this.progress,
      {this.count = 1, this.color = const Color(0xFF0080ff)});

  @override
  void paint(Canvas canvas, Size size) {
    double radius = min(size.width / 2, size.height / 2);

    for (int i = count; i >= 0; i--) {
      final double opacity = (1.0 - ((i + progress) / (count + 1)));
      final Color _color = color.withOpacity(opacity);

      double _radius = radius * ((i + progress) / (count + 1));

      //水波纹
      // Paint _paint = Paint()
      //   ..style = PaintingStyle.fill
      //   ..color = _color;
      // canvas.drawCircle(
      //     Offset(size.width / 2, size.height / 2), _radius, _paint);

      //画的是圆线的
      Paint line = Paint()
        ..color = _color
        ..strokeCap = StrokeCap.round
        ..style = PaintingStyle.stroke
        ..strokeWidth = 2;

      //画圆方法
      canvas.drawCircle(Offset(size.width / 2, size.height / 2), _radius, line);
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

  • 最后说说平移和放大或的动画,这个主要用到的是LayoutBuilder和补间动画RelativeRectTween,还有PositionedTransition自带的组件,这三个配合着使用,
  1. 平移动画首先要给一个开始的位置,还有一个结束的位置.
  2. 放大的动画,同理,要一个开始的大小和结束的大小.
  3. 在用补间动画把两个位置和大小结合起来.
  4. 传入一个动画控制器: rectAnimation.
LayoutBuilder(
        builder: (context, constraints) {
          final Size biggest = constraints.biggest;

          /// 需要平移的Widget 宽高
          childWidth = SAdapt.width(224.0);
          /// 平移后Widget 
          targetChildWidth = SAdapt.width(50);
          /// 根据自身大小,以及父布局大小获取相对位置
          var beginRect = RelativeRect.fromSize(
            Rect.fromLTWH(
                (SAdapt.getScreenWidth() - childWidth) / 2,
                (SAdapt.getScreenHeight() - childWidth) / 2 -
                    SAdapt.width(10) -
                    SAdapt.width(90),
                childWidth,
                childWidth),
            biggest,
          );
          //结束时候的位置和大小,
          var endRect = RelativeRect.fromSize(
            Rect.fromLTWH(
              SAdapt.width(20),
              SAdapt.getTopBarHeight() + SAdapt.width(10),
              targetChildWidth,
              targetChildWidth,
            ),
            biggest,
          );

          /// 补间动画
          final rectAnimation =
              RelativeRectTween(begin: beginRect, end: endRect)
                  .animate(_positionController);

          return Stack(
            children: [
              PositionedTransition(
                rect: rectAnimation,
                child: Container(),
              ),
            ],
          );
        },
      ),
   

如果只需要平移,不需要改大小,把起始的大小设置成一样就可以了.如果只改大小,好像有个更简单的办法,后续会写!

如果有需要跟我一样效果的小伙伴,可以私聊或者留言,我会尽快回复!

今天就到这里了,如果帮助到了你,就请你给我点个赞哦!

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

推荐阅读更多精彩内容