草庐IT

Flutter 致敬大话西游 — 看着一颗跳动的热心

岛上码农 2023-03-28 原文

紫霞仙子:我在你心里留下了一样东西……

至尊宝:原来那个女孩子在我心里留下了一滴眼泪,我完全可以感受到当时她是多么的伤心。
——《大话西游》

前言

引用的是《大话西游》的经典台词之一作为本篇的开头(里面的经典台词太多,数不过来??????),这篇也算致敬一下星爷。昨天就开始在看 AnimatedPadding 的使用,感觉好像做动画没什么有趣的地方,自己折腾了一个类似水波的效果,但是效果不是很满意。然后,就突然想到了大话西游的那一段场景。

紫霞仙子.gif

如果当时至尊宝能够看到他自己心里的紫霞仙子流的眼泪……可惜没有如果。

AnimatedPadding 介绍

AnimatedPadding 组件使用动画的方式调整其子组件与其父组件的内边距。通过调整内部边距可以改变子组件的尺寸,从而会有感觉子组件在放大缩小,例如下面的效果。

AnimatedPadding.gif

AnimatedPadding 的构造方法定义如下:

 AnimatedPadding({
    Key? key,
    required this.padding,
    this.child,
    Curve curve = Curves.linear,
    required Duration duration,
    VoidCallback? onEnd,
  });

与其他 AnimatedXX 组件一样,其实差别就在于多了一个 padding 参数,这个参数就是调节子组件和父组件之间的内边距的。

应用:一颗跳动的心

我们来简单地复刻一下紫霞仙子在至尊宝心里流泪的场景,效果如下:

跳动的心.gif

其实就是两张图片用 Stack 组件堆叠,然后使用AnimatedPadding 调整爱心Stack 的内边距实现动画效果,这样就有心跳的效果了。这里为了实现反复动画,使用了 onEnd 回调来重启动画。源码如下:

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

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

class _AnimatedPaddingDemoState extends State<AnimatedPaddingDemo> {
  final initialPadding = 60.0;
  var padding;
  final duration = 800;
  bool started = false;
  @override
  void initState() {
    padding = initialPadding;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimatedPadding'),
        brightness: Brightness.dark,
        backgroundColor: Colors.black,
      ),
      backgroundColor: Colors.black,
      body: Center(
        child: Container(
          width: 300.0,
          height: 300.0,
          child: AnimatedPadding(
            padding: EdgeInsets.all(padding),
            duration: Duration(milliseconds: duration),
            curve: Curves.easeInCubic,
            child: Stack(
              alignment: Alignment.center,
              children: [
                Image.asset(
                  'images/heart.png',
                ),
                ClipOval(
                  child: Image.asset(
                    'images/zixia.png',
                    width: 60,
                    height: 60,
                    fit: BoxFit.fitHeight,
                  ),
                ),
              ],
            ),
            onEnd: () {
              if (started) {
                setState(() {
                  if (padding < initialPadding) {
                    padding = initialPadding;
                  } else {
                    padding -= 20.0;
                  }
                });
              }
            },
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child:
            Icon(started ? Icons.stop : Icons.play_arrow, color: Colors.white),
        onPressed: () {
          setState(() {
            if (padding < initialPadding) {
              padding = initialPadding;
            } else {
              padding -= 20.0;
            }
            started = !started;
          });
        },
      ),
    );
  }
}

总结

本篇介绍了 AnimatedPadding 的使用,通过 AnimatedPadding可以使用动画的方式调节子组件在父组件中的内边距。AnimatedPadding 具体的应用场景想不出太多,如果是放大缩小这种方式确实可以,但是也可以使用 Matrix4scale 方法来实现,而使用AnimatedPadding好处之一应该是不会超出父组件的边界(padding 值不允许是负数,会抛异常)。关于AnimatedPadding的应用场景,各位如果有好的想法也可以在评论区分享一下??。

有关Flutter 致敬大话西游 — 看着一颗跳动的热心的更多相关文章

  1. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值        D:\Flutter\flutter\bin             这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量:        变量名:FLUTTER_STORAGE_BASE_URL      变量值:https://storage.flutter-io.cn        变量名:PUB_HOSTED_URL      变量

  2. ruby - 用多个词命名一颗 gem 时,应该使用破折号还是下划线? - 2

    当gem名称有多个单词时,我对gem命名约定感到困惑。thinking-sphinx是gem的名称,但此gem的基础*.rb文件是lib/thinking_sphinx.rb(下划线)acts-as-taggable-on是gem的名称,基础*.rb文件称为lib/acts-as-taggable-on.rb(连字符)factory_girl在gem名称和基本*.rb文件的名称中都使用下划线使用下划线或连字符有关系吗?是否有任何正在形成的共识? 最佳答案 EricHodel有一篇关于此的博文:AProjectNamingRecomm

  3. javascript - Internet Explorer 跳动滚动 - 2

    我有这段代码可以将标题元素保持在另一个滚动元素的顶部。它在Firefox和GoogleChrome中完美运行,但在IE中却非常不稳定。代码本身非常简单,我想不出如何改进它。在Chrome和Firefox中,标题一直固定在顶部,但在IE中,它像捕获糖袋的child一样跳来跳去。我无法更改HTML布局,因为我正在使用JQueryUIsortable功能无论如何,这是代码:http://jsfiddle.net/0va4dn0q/8/$('.container').scroll(function(){varfromTop=$(this).scrollTop(),Header=$(this).

  4. flutter 中最详细的继承,多态,接口讲解 - 2

    flutter中最详细的继承,多态,接口讲解前言一、继承(Extends)二、混合mixins(with)2.1、最简单的mixin2.2、on关键字,基于某个类型的mixin2.3、多个mixin2.4、mixin怎么实现多继承三、接口的实现(implement)总结前言众所周知,dart是一门单继承的语言,但是我们在日常开发中,会遇到各种各样的问题,比如,我们需要在dart中实现多继承,那么改怎么办呢?本篇文章,我将和大家聊聊关于dart中的继承,接口,混合的相关知识。类型解决什么问题使用场景限制extends子类继承子类继承父类只能继承一个父类,会继承父类的可见的属性和方法,不能继承构造

  5. 入行软件测试7年,才知道原来字节跳动这么容易进 - 2

    当前就业环境,裁员、失业消息满天飞,好像有一份工作就不错了,更别说高薪了。其实这只是一方面,而另一方面,各大企业依然求贤若渴,高技术人才依然紧缺,只要你技术过硬,拿个年薪50w不是问题。我的人生格言:“比你优秀的人不可怕,可怕的是比你优秀的人比你更努力。”简单的先说一下,坐标深圳,16届本科毕业,算上在字节的面试,一共有面试了有5家公司(因为不想请假,因此只是抽空去其他公司面试,所以面试的公司比较少)​​其中成功的有3家,另外2家失败的原因在于:1.对于系统知识的还是了解不够全面,在最后一轮主管面试的时候,主管问得比较细,最后由于不会回答,就让我直接回去等通知了。2.另外一家失败的是一家小公司

  6. Flutter实现文件上传华为对象存储(OBS) - 2

      本文主要讲述在Flutter项目中如何实现将文件上传到华为OBS(对象存储)中,并封装为三方库方便灵活使用。背景介绍  在大多项目中都会存在文件上传的需求,之前的实现都是调用后台的文件上传接口将文件上传到服务器上,但是这样会存在一个问题,因为文件上传会占用带宽导致在文件上传中调用其他接口的时候就会存在访问慢的情况,解决方案当然是升级带宽或者单独使用一台服务器作为文件服务,而且要带宽足够大不然上传下载的时候会很慢,但是这样两种方案成本都比较高。随着云计算的到来,各大云服务商都提供了对象存储的服务,费用便宜、带宽高、不影响业务系统而且提供了很多附加功能,比如图片处理、图片鉴黄等功能。  因目前

  7. 【大话云原生】负载均衡篇-小饭馆客流量变大了 - 2

    文章目录一、前言二、从路边摊说起三、开饭馆与负载均衡四、饭后沟通一、前言这是《大话云原生》系列的第二篇,第一篇《煮饺子与docker、kubernetes之间的关系》推出之后受到大家的欢迎,很多朋友联系到我给我加油打气,还得到了CSDN头部博主哪吒大佬的支持,感谢!我会继续写下去!书接上回介绍了《煮饺子与docker、kubernetes之间的关系》之后,小娜同学(我老婆)问:为什么不把服务统一开发成一个应用?搞什么分布式?这样感觉很庞大,很复杂啊?为什么要这么搞?所以大话云原生第二篇-负载均衡篇,现在开始!二、从路边摊说起周五晚上加了班,下班的时候已经很晚了,打电话给小娜打算去吃烧烤,就去我

  8. Flutter项目 - 2

    一、项目简介本节的学习目标是通过Flutter技术,实现仿拉勾教育App的效果。其主要的UI效果如下:二、初始化项目初始化项目fluttercreateflutter_project修改文件flutter项目/android/build.gradle,把google()和jcenter()这两行去掉。改为阿里的镜像地址。//google()//jcenter()maven{url'https://maven.aliyun.com/repository/google'}maven{url'https://maven.aliyun.com/repository/jcenter'}maven{url

  9. 【大话云原生】微服务篇-五星级酒店的服务方式 - 2

    《大话云原生》系列文章期望用最通俗、简单的语言说明云原生生态系统内的组成及应用关系。此专栏的前两篇文章《【大话云原生】煮饺子与docker、kubernetes之间的关系》《【大话云原生】负载均衡篇-小饭馆的流量变大了》欢迎品鉴!文章目录一、服务接待中心与微服务网关二、酒店内部通信录与服务注册中心三、微服务的高可用一、服务接待中心与微服务网关老婆最近快过生日了,我答应她去旅游住一次五星级酒店。我查看了目的地的五星级酒店的价格,决定只住一天。第一次住所以查看了一下特色服务项目:擦鞋、熨烫衣物、机场绿色通道、专车接送等等,几乎在酒店场所范围内一切可以让你懒出奇迹的项目都可以提供。没出息的时不我待,

  10. 字节跳动抖音推荐算法实习生一面凉经 - 2

    面试大概50分钟本来投的是头条开发岗位,不知为何被捞到了推荐算法岗位。多位推荐算法hr一直约我面试,说经历和他们部门契合。我从年底推到年后,最后答应面试,这也是读研以来第一次面试。大概是自己准备不充分,一面就凉凉了,留下一次不好的经历。面试完差不多下午三点了,当时在想下午五点不通知二面应该就是凉凉了,然而五点之前真没收到通知。第二天中午的时候收到了感谢信,果然是凉凉了。唉,连找个实习都这么难。下面是整个面试流程1、2分钟自我介绍。2、本人大四期间在某小公司实习的项目,项目是简单的机器学习项目。问数据怎么获取?东方财富网上爬取公开的财务数据,接口都是公开的,简单的get和post请求。数据标签怎

随机推荐