Blame view

node_modules/echarts/src/util/animation.js 3.37 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
  */
  
  import * as zrUtil from 'zrender/src/core/util';
  
  /**
   * @param {number} [time=500] Time in ms
   * @param {string} [easing='linear']
   * @param {number} [delay=0]
   * @param {Function} [callback]
   *
   * @example
   *  // Animate position
   *  animation
   *      .createWrap()
   *      .add(el1, {position: [10, 10]})
   *      .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400)
   *      .done(function () { // done })
   *      .start('cubicOut');
   */
  export function createWrap() {
  
      var storage = [];
      var elExistsMap = {};
      var doneCallback;
  
      return {
  
          /**
           * Caution: a el can only be added once, otherwise 'done'
           * might not be called. This method checks this (by el.id),
           * suppresses adding and returns false when existing el found.
           *
           * @param {modele:zrender/Element} el
           * @param {Object} target
           * @param {number} [time=500]
           * @param {number} [delay=0]
           * @param {string} [easing='linear']
           * @return {boolean} Whether adding succeeded.
           *
           * @example
           *     add(el, target, time, delay, easing);
           *     add(el, target, time, easing);
           *     add(el, target, time);
           *     add(el, target);
           */
          add: function (el, target, time, delay, easing) {
              if (zrUtil.isString(delay)) {
                  easing = delay;
                  delay = 0;
              }
  
              if (elExistsMap[el.id]) {
                  return false;
              }
              elExistsMap[el.id] = 1;
  
              storage.push(
                  {el: el, target: target, time: time, delay: delay, easing: easing}
              );
  
              return true;
          },
  
          /**
           * Only execute when animation finished. Will not execute when any
           * of 'stop' or 'stopAnimation' called.
           *
           * @param {Function} callback
           */
          done: function (callback) {
              doneCallback = callback;
              return this;
          },
  
          /**
           * Will stop exist animation firstly.
           */
          start: function () {
              var count = storage.length;
  
              for (var i = 0, len = storage.length; i < len; i++) {
                  var item = storage[i];
                  item.el.animateTo(item.target, item.time, item.delay, item.easing, done);
              }
  
              return this;
  
              function done() {
                  count--;
                  if (!count) {
                      storage.length = 0;
                      elExistsMap = {};
                      doneCallback && doneCallback();
                  }
              }
          }
      };
  }