code: function (easing, forceAnimate) {
  
          var self = this;
          var clipCount = 0;
  
          var oneTrackDone = function () {
              clipCount--;
              if (!clipCount) {
                  self._doneCallback();
              }
          };
  
          var lastClip;
          for (var propName in this._tracks) {
              if (!this._tracks.hasOwnProperty(propName)) {
                  continue;
              }
              var clip = createTrackClip(
                  this, easing, oneTrackDone,
                  this._tracks[propName], propName, forceAnimate
              );
              if (clip) {
                  this._clipList.push(clip);
                  clipCount++;
  
                  // If start after added to animation
                  if (this.animation) {
                      this.animation.addClip(clip);
                  }
  
                  lastClip = clip;
              }
          }
  
          // Add during callback on the last clip
          if (lastClip) {
              var oldOnFrame = lastClip.onframe;
              lastClip.onframe = function (target, percent) {
                  oldOnFrame(target, percent);
  
                  for (var i = 0; i < self._onframeList.length; i++) {
                      self._onframeList[i](target, percent);
                  }
              };
          }
  
          // This optimization will help the case that in the upper application
          // the view may be refreshed frequently, where animation will be
          // called repeatly but nothing changed.
          if (!clipCount) {
              this._doneCallback();
          }
          return this;
      }
docs: 开始执行动画
  @param  {string|Function} [easing]
  动画缓动函数，详见{@link module:zrender/animation/easing}
  @param  {boolean} forceAnimate
  @return {module:zrender/animation/Animator}