likes
comments
collection
share

《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因

作者站长头像
站长
· 阅读数 15

前因

突然有一天,设计师小姐姐说,老板让我做了一个加载状态动画,就问你怕不怕.我淡定的说,给我gif图.然后小姐姐说不可以.

多大点事.这还能难倒我了.虽然我会的不多,但我会拆分啊.由于时间紧,我这里就不去画渐变了.直接使用图片代替.后续有时间了,改成绘画.

复杂的动画.无非是有简单的动画组合使用.话不多说,先看第一种状态的动画效果,后面我还会把剩下的动画状态补上.

《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因

分析

从上面的表现层来说

  • 整体动画效果分为两种

    • 旋转动画
    • 缩放动画
  • 从图层来说分为6层:

    图层描述图层样式
    底层虚化阴影《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因
    缩放背景《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因
    逆时针光线《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因
    逆时针边线《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因
    圆环《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因
    渐变色《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因

经过分解之后,来实现动画,就相对来说简单.只需要实现旋转缩放动画即可.

实现

为了实现上面的动画,我们需要准备两个部分.

  • 动画的执行

    官方文档中.我们知道.如果想要执行动画效果,必须要创建一个动画实例,并调用实例的方法来描述动画是旋转还是缩放.然后最后通过动画实例eport方法导出动画数据,并赋值给组件animation属性.基本上满足了我们的需求.

    • 创建动画实例

      createAnimation(time) {
           return wx.createAnimation({
                 duration: time,// 动画执行时间
                 timingFunction: 'linear',//表示动画匀速执行
                 delay: 0, // 动画延迟事件
                 transformOrigin: '50% 50% 0'
            });
      }
      

      这里就不一一讲解参数含义了,不懂的直接看官方文档即可.从上面的方法中,我们就创建好动画实例了.经我们分析动画.等到三个动画效果.并且每一个动画时长也是不一样的.如下所示

      动画效果动画时长
      顺时针旋转动画500ms
      逆时针旋转动画1000ms
      缩放动画1500ms

      这样我们就可以先把动画实例创建一下.

      • 定义全局动画实例基数动画时长 《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因

      • 在组件进入树节点时,创建动画实例

        《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因

    • 描述动画

      创建好动画实例后,我们再把对应的动画效果创建一下.如下所示

      /// 顺时针动画效果
      _clockwiserotaeAnim.rotate(120 * n).step();
      /// 逆时针动画效果
      _anitclockwiserotaeAnim.rotate(-120 * n).step();
      /// 缩放动画效果
      /// 定义缩放倍数.
      let nscale = this.data.scale == 1.3 ? 1.0 : 1.3;
      _scaleAnim.scale(nscale).step();
      
    • 赋值给animation

      拿到描述动画后,我们按照官方文档示例,现在就需要导出赋值.

      • 导出

        /// 顺时针动画导出
        this.setData({
           clockAnima: _clockwiserotaeAnim.export(),
         })
        /// 逆时针动画导出
        this.setData({
           anitclockAnima: _anitclockwiserotaeAnim.export()
         });
        /// 缩放动画导出
        this.setData({
           scaleAnim: _scaleAnim.export(),
           scale: nscale,
        })
        
    • 赋值

      由于赋值都是一样的,这里就举例说明一下即可.

      <image  animation="{{scaleAnim}}" />
      

      经过上面的配置,动画就已经初步完成了.如下所示 《设计师小姐姐说,我做了个状态动画 就问你怕不怕?》之前因

  • 无限循环

    为了让我们的动画可以一直执行,这里就需要使用定时器,让动画重复执行即可,从上面的动画时长中,我们知道,他们的时间比例时1:2:3.所以,我们只需要一个定时器即可.经过逻辑处理,来执行3个动画.

    • 定义定时器的标识
      var _intervalId = -1; // 动画定时任务id,通过setInterval来达到无限旋转,记录id,用于结束
      
    • 定时器使用
      _intervalId = setInterval(() => {
           let time = this.data.animatime + _ANIMATION_TIME;
           /// 每500ms执行一下顺时针旋转动画
           that.configAnimation(time / 500 + 1, 0);
           if (time % 1500 == 0) {
               /// 每1500ms执行一下缩放动画
               that.configAnimation(0, 2);
           }
           if (time % 1000 == 0) {
               /// 每1000ms执行逆时针动画
               that.configAnimation(time / 1000 + 1, 1);
           }
           this.setData({
               animatime: time
           })
       }, _ANIMATION_TIME);
      
    • 定时器的销毁
      // 动画结束
      
       stopAnimation() {
            // 这是为了判断定时器是否存在.
           if (_intervalId > 0) {
               // 销毁定时器
               clearInterval(_intervalId);
               _intervalId = -1;
           }
      },
      

    经过上面定时执行.我们第一种状态的动画就完成.

    今天分享主要是在遇到复杂的动画的时候,不要慌,学会拆分动画.一个一个去实现,总会完成的.

demo

系列文章

学习资料