Flutter(十八)——支付宝咻一咻动画实践

简介: Flutter(十八)——支付宝咻一咻动画实践

咻一咻设计


对于支付宝咻一咻功能,是在2016年的时候上线到支付宝的,那个时候好像是专门为了集五福而设计的功能,现在肯定已经不在了,不过这也是一个动画功能,对于实践Flutter动画在合适不过了。(下图是我们最后实现的效果)

首先,我们来看看上图,具体有那些设计,比如它有三个圆圈匀速放大的动画,其次,中间有一个按钮,用户点击之后,就会出现如上动画的效果,ok,也就是这么多,弄清楚几个动画,我们就来实践一下。


代码实现咻一咻


三个动画的实现

对于代码的实现,我们肯定首先实现其3个动画,前面已经讲过了,要实现这种动画的效果,会用到AnimationController,Animation以及Tween,下面我们直接上代码:

AnimationController controller;
  Animation<double> animation1,animation2,animation3;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    controller=AnimationController(duration: widget.duration,vsync: this)..repeat();//初始化,动画控制器执行实践为2秒
    animation1=Tween(
        begin: 0.0,
        end: 1.0)
        .animate(
        CurvedAnimation(
            parent: controller,
            curve: const Interval(0.0, 0.5,curve: Curves.linear)))
      ..addListener(
              ()=>setState(()=><String,void>{})
      );//线性动画
    animation2=Tween(
        begin: 0.0,
        end: 1.0)
        .animate(
        CurvedAnimation(
            parent: controller,
            curve: const Interval(0.25, 0.75,curve: Curves.linear)))
      ..addListener(
              ()=>setState(()=><String,void>{})
      );//线性动画
    animation3=Tween(
        begin: 0.0,
        end: 1.0)
        .animate(
        CurvedAnimation(
            parent: controller,
            curve: const Interval(0.5, 1.0,curve: Curves.linear)))
      ..addListener(
              ()=>setState(()=><String,void>{})
      );//线性动画
  }
  @override
  void dispose() {
    // TODO: implement dispose
    controller.dispose();//销毁释放
    super.dispose();
  }


每次操作动画,记得控制器一定要销毁,上面有三个动画,分别是(0.0,0.5),(0.25,0.75),(0.5,1.0)三段动画,都是Curves.linear匀速效果。


构建圆


既然我们写好的动画,动画肯定需要执行在组件之上,而我们放大的效果就是圆边框组件,所以我们需要实现一个圆边框组件,代码如下:

Widget _itemBuilder(index){
    return SizedBox.fromSize(//创建具有指定大小的框
      size: Size.square(widget.size),//宽高一致
      child: widget.itemBuidler!=null?widget.itemBuidler(context,index):DecoratedBox(
        decoration: BoxDecoration(
         shape: BoxShape.circle,//圆
         border: Border.all(color: widget.color,width: widget.borderWidth), //指定边框颜色和宽
        ),
      ),
    );


透明效果


咻一咻不仅仅只有放大的动画效果,在放大的过程之中,圆圈也会慢慢淡去,所以我们还需要实现Opacity组件,而且圆圈都是居中显示叠加的效果,所以我们需要使用到Stack组件,代码如下:


@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("咻一咻功能实现"),),
      body: Center(
        child: Stack(
          alignment: Alignment.center,
          children: <Widget>[
            CircleAvatar(
              backgroundImage: AssetImage("assets/timg.jpg"),
              radius: 30.0,
            ),
            Opacity(
              opacity: 1.0-animation1.value,
              child: Transform.scale(scale: animation1.value,child: _itemBuilder(0),),
            ),
            Opacity(
              opacity: 1.0-animation2.value,
              child: Transform.scale(scale: animation2.value,child: _itemBuilder(1),),
            ),
            Opacity(
              opacity: 1.0-animation3.value,
              child: Transform.scale(scale: animation3.value,child: _itemBuilder(2),),
            ),
          ],
        ),
      ),
    );
  }


Transform.scale是放大的方法,opacity: 1.0-animation3.value,监测透明度的变化,从大到小慢慢消失,中间还有一个按钮组件CircleAvatar,如果想通过点击实现也可以套一层前面介绍的手势组件GestureDetector,监听onTap()属性就行。


到这里,我们就完成了支付宝咻一咻的所有代码,相信用Flutter实现起来还是非常简单的,当然,还有其他代码和一些参数,如下:

class MyHomePage extends StatefulWidget {
  MyHomePage({
    Key key,
    this.title,
    this.size=500.0,
    this.borderWidth=16.0,
    this.itemBuidler,
    this.duration=const Duration(milliseconds: 1800),
    this.color=Colors.orange,
  }) : assert(color!=null),
        assert(size!=null),
        assert(borderWidth!=null),
        super(key: key);
  final String title;
  final double size;
  final double borderWidth;
  final Color color;
  final Duration duration;
  final IndexedWidgetBuilder itemBuidler;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
相关文章
|
11月前
动画控制器在 Flutter 中的工作原理
【10月更文挑战第18天】总的来说,动画控制器 `AnimationController` 在 Flutter 中起着关键的作用,它通过控制动画的数值、速度、节奏和状态,实现了丰富多彩的动画效果。理解它的工作原理对于我们在 Flutter 中创建各种精彩的动画是非常重要的。
203 60
|
10月前
|
开发工具 UED 容器
Flutter&鸿蒙next 实现长按录音按钮及动画特效
本文介绍了如何在 Flutter 中实现一个带有动画效果的长按录音按钮。通过使用 `GestureDetector` 监听长按手势,结合 `AnimatedContainer` 和 `AnimationController` 实现按钮的动画效果,以及 `flutter_sound` 插件完成录音功能。文章详细讲解了功能需求、实现思路和代码实现,帮助读者逐步掌握这一实用功能的开发方法。
392 5
|
10月前
|
前端开发 开发者
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
本文深入探讨了 Flutter 中的绘图功能,重点介绍了 CustomPainter 和 Canvas 的使用方法。通过示例代码,详细讲解了如何绘制自定义图形、设置 Paint 对象的属性以及实现高级自定义动画。内容涵盖基本绘图、动画基础、渐变动画和路径动画,帮助读者掌握 Flutter 绘图与动画的核心技巧。
247 1
|
前端开发
Flutter快速实现自定义折线图,支持数据改变过渡动画
Flutter快速实现自定义折线图,支持数据改变过渡动画
294 4
Flutter快速实现自定义折线图,支持数据改变过渡动画
|
SQL 分布式计算 大数据
Flutter技术实践问题之Flutter应用过程中的基础建设如何解决
Flutter技术实践问题之Flutter应用过程中的基础建设如何解决
89 10
|
11月前
|
UED
flutter:动画&状态管理 (十三)
本文档介绍了Flutter中`animatedList`的使用方法和状态管理的示例。`animatedList`用于创建带有动画效果的列表,示例代码展示了如何添加、删除列表项,并执行相应的动画效果。状态管理部分通过一个简单的点击切换颜色的示例,演示了如何在Flutter中管理组件的状态。
138 0
|
新零售 前端开发 小程序
Flutter技术实践问题之基于Flutter的Canvas的应用优势如何解决
Flutter技术实践问题之基于Flutter的Canvas的应用优势如何解决
113 2
|
Web App开发 新零售 前端开发
Flutter技术实践问题之阿里集团内Flutter体系化建设如何解决
Flutter技术实践问题之阿里集团内Flutter体系化建设如何解决
100 1
|
设计模式 编解码 API
Flutter UI设计模式与实现:深入探索与实践
【7月更文挑战第20天】Flutter以其独特的声明式UI模式和丰富的UI组件库,为移动应用开发提供了强大的支持。通过深入理解Flutter的UI设计模式和实现技巧,开发者可以构建出高性能、可维护性强的UI界面。同时,随着Flutter生态的不断完善和发展,相信未来Flutter将在移动应用开发领域发挥更加重要的作用。
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes入门与实践打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第31天】云原生技术正改变着应用开发和部署的方式。本文将带你了解云原生的基石——Kubernetes,通过实际的代码示例,从安装到部署一个简单的应用,让你迅速掌握Kubernetes的核心概念和操作方法。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你进入云原生世界的桥梁。