首页 > 其他分享 >flutter系列之:做一个修改组件属性的动画

flutter系列之:做一个修改组件属性的动画

时间:2023-05-09 14:35:15浏览次数:51  
标签:动画 widget AnimatedContainer borderRadius random 组件 flutter 属性

目录

简介

什么是动画呢?动画实际上就是不同的图片连续起来形成的。flutter为我们提供了一个AnimationController来对动画进行详尽的控制,不过直接是用AnimationController是比较复杂的,如果只是对一个widget的属性进行修改,可以做成动画吗?

答案是肯定的,一起来看看吧。

flutter中的动画widget

如果你只是希望动画展示widget的属性的变化,比如比如长度,高度,宽度或者颜色等进行动态变化,那么可以直接使用flutter提供的AnimatedContainer。

先来看下AnimatedContainer的定义:

class AnimatedContainer extends ImplicitlyAnimatedWidget

AnimatedContainer继承自ImplicitlyAnimatedWidget,什么是ImplicitlyAnimatedWidget呢?翻译过来就是隐式的动画widget。

这个widget会自动根据widget属性的变化生成对应的动画。在使用上非常的简单。

AnimatedContainers使用举例

AnimatedContainer是一个container,所以它可以包含child属性,但是AnimatedContainer的动画只是针对容器本身来说的,动画并不会应用到它的child中。

所以为了展示widget本身的变化,我们可以给widget设置一个BoxDecoration,设置它的颜色跟borderRadius。

如下所示:

body: Center(
          child: AnimatedContainer(
            width: 200,
            height: 200,
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(10),
            ),
            duration: const Duration(seconds: 1),
            curve: Curves.easeInBack,
          ),
        )

上面的代码会在界面上展示一个长度和宽度都等于200的Container,它的背景是blue,还有一个圆形的borderRadius。

并且我们定义了动画的duration和变动曲线的方式。

接下来我们只需要在setState方法中对AnimatedContainer中的属性进行变化,就会自动触发动画效果。

为了实现这个动画的功能,我们需要把width,height等属性用动态变量存储起来,这样才可以在setState的时候对属性进行变动。

我们将这些属性放在一个StatefulWidget的State中:

  double _width = 100;
  double _height = 100;
  Color _color = Colors.blue;
  BorderRadiusGeometry _borderRadius = BorderRadius.circular(10);

这样我们在build方法中使用上面定义的属性:

        body: Center(
          child: AnimatedContainer(
            width: _width,
            height: _height,
            decoration: BoxDecoration(
              color: _color,
              borderRadius: _borderRadius,
            ),
            duration: const Duration(seconds: 1),
            curve: Curves.easeInBack,
          ),
        )

然后在floatingActionButton的onPressed中修改这些属性,从而实现widget属性变化的动画功能:

floatingActionButton: FloatingActionButton(
          onPressed: () {
            setState(() {
              final random = Random();

              _width = random.nextInt(200).toDouble();
              _height = random.nextInt(200).toDouble();

              _color = Color.fromRGBO(
                random.nextInt(256),
                random.nextInt(256),
                random.nextInt(256),
                1,
              );

              _borderRadius =
                  BorderRadius.circular(random.nextInt(10).toDouble());
            });
          }

最后实现的效果如下:

总结

如果你只是希望使用简单的widget动画,那么AnimatedContainer可能是你最好的选择。

本文的例子:https://github.com/ddean2009/learn-flutter.git

标签:动画,widget,AnimatedContainer,borderRadius,random,组件,flutter,属性
From: https://www.cnblogs.com/flydean/p/17384921.html

相关文章

  • 如何利用Spine制作简单的2D骨骼动画(附软件下载)
    在2D游戏中,我们经常看到各种各样的角色动画。动画能给游戏带来生机和灵气。创作一段美妙的动画,不仅需要强大的软件工具,更需要一套完善的工作流程。Spine就是一款针对游戏开发的2D骨骼动画编辑工具。Spine可以提供更高效和简洁的工作流程,以创建游戏所需的动画。下载Spine3.8.7......
  • 11_父组件调用子组件方法
    父组件调用子组件的方法使用ref使用变量+watch使用中间class使用中间classbase-on-controllerfunctionreceiveController(to,from){Object.assign(to,from);}/*vue混入模式*/receiveController.mixin={methods:{receiveController}};expor......
  • 常用组件
    常用组件分页推导首先我们需要明确的时候,get请求也是可以携带参数的,所以我们在朝后端发送查看数据的同时可以携带一个参数告诉后端我们想看第几页的数据其次我们还需要知道一个点,queryset对象是支持索引取值和切片操作的,但是不支持负数索引情况接下来我们就可以推导我们的自定......
  • Vue "引用式"调用组件内函数
    场景希望在点击页面上的某个button时,刷新某个组件的内容.组件内容刷新函数getStatistic()在组件<Table/>内,当点击"统计"按钮时,页面Block切换至统计页面,同时调用对应组件中的getStatistic()函数,更新数据.解决方案//创建一个ref对象,接受<Table/>组件......
  • 开机动画生成可烧写bin文件
    1、进入LVGL的官网Onlineimageconverter-BMP,JPGorPNGtoCarrayorbinary|LVGL得到原图片的bin文件但是它生成的bin文件会有4个字节的文件头,所以在使用的时候记得跳过这4字节2、合并大bin将如下代码贴到空白的bat文件中,双击运行即可得到output.bin1@echoof......
  • 第六节:受控 、高阶组件、portals、fragment、严格模式、动画
    一.受控组件       二.高阶组件       三.portals      四.fragment        五.严格模式        六.动画         !作       者:Yaopengfei(姚鹏飞)博客地......
  • vue3 多级数据下拉选择组件
    若依的下拉组件太复杂,我改了一下,希望对大家有帮助,基于element-plusel-tree-select组件:举个栗子,TreeSelect.vue:<template><div><el-tree-selectstyle="width:100%"v-model="valueId"id="tree-option"ref="s......
  • vue2自定义组件@click点击失效问题及解决
    1.参照官方文档,可以用@click.native=“click”解决2.$emit组件之间事件传递解决https://www.jb51.net/article/246610.htm......
  • 108中超轻量级的加载动画!
    大家好,我是【程序视点】小二哥!今天要上的菜不是Animate.js,也不是Move.js,而是能提供108种加载动画的库:Whirl.最省力的加载动画话不多说,直接来看例子。以上只是冰山一角。whirl的CSS加载动画集合中有108种选项供你挑选。选中喜欢的动画后,点击“GrabtheCSSonGithub......
  • 若依--图片预览组件
    若依的图片预览组件,很实用,放在这里:<template><el-image:src="`${realSrc}`"fit="cover":style="`width:${realWidth};height:${realHeight};`":preview-src-list="realSrcList":preview-teleported="t......