2

JPEGに基づいてsvgでフレームベースのアニメーションを実装するための最良の方法を誰かが提案できますか?

私が見つけた1つの例はこれです:

<svg version="1.1" baseProfile="tiny" id="svg-root"
  width="100%" height="100%" viewBox="0 0 480 360"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

   <image width="320" height="240" xlink:href="test1.jpg">
      <animate id='frame_0' attributeName='display' values='inline;none'
               dur='0.5s' fill='freeze' begin="0s" repeatCount="indefinite"/>
   </image>

   <image width="320" height="240" xlink:href="test2.jpg">
      <animate id='frame_1' attributeName='display' values='none;inline'
               dur='0.5s' fill='freeze' begin="0.5s" repeatCount="indefinite" />
   </image>

</svg>

2フレームで動作しますが、実際にはスケーリングされません。100フレーム以上対応できるものが欲しいです。

4

3 に答える 3

2

それははるかに簡単です:

<svg version="1.1" baseProfile="tiny" id="svg-root"
  width="100%" height="100%" viewBox="0 0 480 360"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

  <image width="320" height="240" xlink:href="test1.jpg">
    <animate attributeName="xlink:href" 
      values="test1.jpg;test2.jpg" 
      begin="0s" repeatCount="indefinite" dur="1s"/>
  </image>

</svg>
于 2012-11-09T22:07:27.167 に答える
0

別のアプローチとして、

アニメーションは機能しているが、ファイルをセットアップするのに生産量が多すぎるという問題がある場合は、テンプレートを使用して SVG を生成できます。

Grunt.Jsのようなものを使用して、ディレクトリ内のすべての画像を読み取り、アンダースコア テンプレートを使用して、ファイルパスの配列から既にセットアップした方法で SVG フレームを構築します。

これらのコード スニペットはそのままでは機能しない可能性がありますが、かなり近いものです。

ここで、grunt ファイルはフォルダー内のファイルを取得し、それらが画像であるかどうかを確認してから、それらを配列にプッシュします。

// gruntfile.js //

var fs = require('fs');
var path = require('path');
var _ = require("underscore");

grunt.registerTask('Build Animated SVG', function () {

    var template = grunt.file.read("/path to SVG underscore template/");    //see SVG section below.

        var frames = [];
        var pathtoframes = "mypath";
        var mySVG = "mysvg.svg";

        fs.readdirSync(path.resolve(pathtoframes)).forEach(function (file) {

            if (filetype == "svg" || filetype == "png" || filetype == "jpg" || filetype == "gif") {
                var frame = {};
                frame.src = pathtoframes + "/" + file;
                frames.push(frame);
            }
        });

var compiledSVG = _.template(template, {frames:frames});

grunt.file.write(path.resolve(pathtoframes) + "/compiled_" + mySVG, compiledSVG);

});

このテンプレートは grunt ファイルによって読み込まれ、アンダースコアは各ファイルをループして大きな文字列に書き込みます。次に、Grunt はそれを読み込み可能な SVG として保存します。

<!-- SVG underscore template -->
    <svg version="1.1" baseProfile="tiny" id="svg-root"
          width="100%" height="100%" viewBox="0 0 480 360"
          xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

          <% _.each(frames, function(frame, index){ %>
             <image width="320" height="240" xlink:href="<%= frame.src %>">
                <animate 
                         id='frame_<%= index %>' 
                         attributeName='display' 
                         values='none;inline'
                         dur='0.5s' 
                         fill='freeze' 
                         begin="0.5s" 
                         repeatCount="indefinite" 
                         />
            </image>
        <% } %>
    </svg>
于 2015-04-12T20:38:00.563 に答える
0

https://michaelsboost.github.io/SVGAnimFrames/

これには、私のライブラリSVGAnimFramesを簡単に使用できます。1行のコードを呼び出すだけで...

SVGAnimFrames("#bounce svg", "repeat", "40", "0");

ここに画像の説明を入力

使用方法については、 Github リポジトリを参照してください。

理想的には、スプライトシートを使用し、フレームごとにアニメーション化して、不要な http リクエストを最小限に抑えることをお勧めします。

于 2021-03-27T02:59:02.703 に答える