code: function animate(toProps, duration, easing, callback) {
      var delay = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
  
      var self = this;
      self.set('animating', true);
      var timeline = self.get('timeline');
      if (!timeline) {
        timeline = self.get('canvas').get('timeline');
        self.setSilent('timeline', timeline);
      }
      var animators = self.get('animators') || [];
      // 初始化tick
      if (!timeline._timer) {
        timeline.initTimer();
      }
      if (Util.isNumber(callback)) {
        delay = callback;
        callback = null;
      }
      if (Util.isFunction(easing)) {
        callback = easing;
        easing = 'easeLinear';
      } else {
        easing = easing ? easing : 'easeLinear';
      }
      var formatProps = getFormatProps(toProps, self);
  
      // 记录动画属性
      var animator = {
        fromAttrs: getFromAttrs(formatProps, self),
        toAttrs: formatProps.attrs,
        fromMatrix: Util.clone(self.getMatrix()),
        toMatrix: formatProps.matrix,
        duration: duration,
        easing: easing,
        callback: callback,
        delay: delay,
        startTime: timeline.getTime(),
        id: Util.uniqueId()
      };
      // 如果动画队列中已经有这个图形了
      if (animators.length > 0) {
        // 先检查是否需要合并属性。若有相同的动画，将该属性从前一个动画中删除,直接用后一个动画中
        animators = checkExistedAttrs(animators, animator);
      } else {
        // 否则将图形添加到队列
        timeline.addAnimator(self);
      }
      animators.push(animator);
      self.setSilent('animators', animators);
      self.setSilent('pause', { isPaused: false });
    }
docs: 执行动画
  @param  {Object}   toProps  动画最终状态
  @param  {Number}   duration 动画执行时间
  @param  {String}   easing   动画缓动效果
  @param  {Function} callback 动画执行后的回调
  @param  {Number}   delay    动画延迟时间