svgjs如何使用滑块重放和控制一系列动画

时间:2017-03-07 19:52:27

标签: javascript animation svg svg.js

我正在使用svg.js并希望播放一系列动画,然后为用户提供一个滑块来控制动画以更仔细地查看它。看起来当动画完成时,svg.js会清理资源,因此情况会被清除,所以我无法重置它。我有一个简化的例子。动画播放一次后,我希望能够使用滑块并使用at方法重新定位动画。

https://jsfiddle.net/voam/xeajbhea/2/

var draw = SVG('drawing'),
  rectA1 = draw.rect(50, 50).fill('#f06'),
  rectA2 = draw.rect(50, 50).fill('#60f').translate(200),
  rectB1 = draw.rect(50, 50).fill('#ce0').translate(0, 100).opacity(0),
  rectB2 = draw.rect(50, 50).fill('#0ec').translate(200, 100).opacity(0);

var animation1 = rectA1.animate().move(200).opacity(0);
var animation2 = rectA2.animate().move(-200).opacity(0).during(function(pos) {
  document.getElementById("range_animation").value = pos;
});
var animation3, animation4;

animation2.after(function(situation) {

  animation3 = rectB1.animate().move(200).opacity(1);
  animation4 = rectB2.animate().opacity(1).move(-200)
    .during(function(pos) {
      document.getElementById("range_animation").value = 1 + pos;
    });
  console.log('animations', animation1, animation2, animation3, animation4);

});

document.getElementById("range_animation").addEventListener("change", function(el) {
  ///console.log('change', el, );
  var val = this.value;    

  if (animation1.situation) {
    if (val < 1) {
      animation1.at(val).pause();
      animation2.at(val).pause();
    } else {
      animation3.at(val - 1).pause();
      animation4.at(val - 1).pause();
    }
  }



}, false);

HTML下面

<div id="drawing">

</div>
<input type="range" id="range_animation" min="0.01" max="2" step=".01" value=".01">

1 个答案:

答案 0 :(得分:0)

一种有效的方法是@Fuzzyma提到的是制作动画循环以便它们不会被终止。然后必须管理从一个到另一个的过渡集。任何不能立即运行的动画都会在暂停状态下开始。在我的真实项目中,不是这个演示有5个动画集,每个动画集都有动画,所以让我们看看这是否可以管理!

 var atEnd = function (pos) {

            var rounded = pos.toFixed(2);
            return  (rounded == .99 || rounded == 1.00);
        };

    var draw = SVG('drawing')
        , rectA1 = draw.rect(50, 50).fill('#f06')
        , rectA2= draw.rect(50, 50).fill('#60f').translate(200)
        , rectB1 = draw.rect(50, 50).fill('#ce0').translate(0, 100).opacity(0)
        , rectB2 = draw.rect(50, 50).fill('#0ec').translate(200, 100).opacity(0);

    var animation3, animation4, lastTotalRange;

    var animation1 = rectA1.animate().move(200).opacity(0).loop();
    var animation2 = rectA2.animate().move(-200).opacity(0).loop();

    animation2
        .during(function( pos ) {

            document.getElementById("range_animation").value = pos;

            if ( atEnd (pos) ) {

                animation2.pause();

                animation3 = rectB1.animate().move(200).opacity(1).loop();
                animation4 = rectB2.animate().opacity(1).move(-200).loop();

                animation4
                    .during(function( pos ) {

                        if (pos > 0) {
                            document.getElementById("range_animation").value = 1 + pos;
                        }


                        if (atEnd (pos)) {
                            animation4.pause();
                        }

                    });

                animation3.during( function(pos) {

                    if (atEnd (pos)) {
                        animation3.pause();
                    }
                });
            }
        });

    animation1.during(function( pos ) {

        if (atEnd (pos)) {
            animation1.pause();
        }
    });

    $('input#range_animation').on('input', function() {
        $(this).trigger('change');
    })
    $('input#range_animation').on('change', function() {

        var val = $( this).val(),
            delta = 0;
        if (lastTotalRange) {
            delta = val - lastTotalRange;
        }
        if (val < 1) {
            animation1.at(val).pause();
            animation2.at(val).pause();
            if (lastTotalRange > 1) {
                animation3.at(.01);
                animation4.at(.01);
            }
        }
        else {
            animation3.at(val - 1).pause();
            animation4.at(val - 1).pause();
            if (lastTotalRange < 1) {
                animation1.at(.99);
                animation1.at(.99);
            }
        }
      //  console.log('totalAnimationRange:change', delta, val);

        lastTotalRange = val;
    })

和html

<div id="drawing"></div>

<input type="range" id="range_animation" min="0.00" max="1.99" step=".01" value=".01">

和jsfiddle:

jsfiddle.net/voam/ob2bjfur/1/