2013-04-28 64 views
2

我有一个PSD文件,其中有一些图层是动画的帧。我如何使用JQuery/JavaScript创建一个动画?使用JQuery从PSD图层创建动画帧

我需要将每个图层保存为一个单独的图像,有没有办法让一个图像有多个图层动画?为了澄清,我不希望实际的图像移动,我只是想要显示不同的图层,就好像它们是动画的帧一样。这是用JavaScript完成的标准方式是什么?

谢谢!

+0

每帧+ javacsript定时器的各个图片到我的知识。为什么不把帧转换为gif?我知道那不是你的问题。就是想。 – Onimusha 2013-04-28 20:40:31

回答

0

这是演示javascript定时器+个人图像方法的小提琴。

小提琴:http://jsfiddle.net/ZVFu8/2/

基本的想法是创建与您的图像的名称的数组。

var img_name_arr = []; 
var img_name_root = "anim-"; 
var img_name_ext = ".gif"; 
var num_images = 12; 

// init arr of img names assuming frames are named [root]+i+[extension] 
for (i = 0; i<=num_images; i++) { 
    img_name_arr.push(img_name_root + i + img_name_ext); 
}  

对于动画,请使用setInterval()。在JavaScript中,间隔定期执行。您指定要执行的代码以及代码运行的时间间隔(以毫秒为单位)。

每次调用间隔时,都可以通过将image标记的“src”属性设置为image_name数组中的下一个索引来显示新图像。

// Create an interval, and save a handle to the interval so it can be stopped later 
anim_interval = setInterval(function() { 
    $("#player").attr("src", s + img_name_arr[(anim_frame++ % num_images)+1]); 
}, frame_interval); 

根据您的动画的长度和每个图像文件的大小,可能需要通过预加载这些图像来优化此图像。在动画开始之前,您可以为每个图像创建一个img标签并隐藏它。然后,而不是更改“src”属性来更改图像,而是实际上隐藏当前图像并取消隐藏之前图像位置中的下一个图像。

以下是完整的代码,如果你想在本地运行此:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 

<a id="anim_control" href="">Start</a> 
<img id="player" src="" /> 


<script> 
var s = "http://" + atob("YmVucmlkb3V0LmNvbQ==") + "/"; 
var img_name_arr = []; 
var img_name_root = "anim-"; 
var img_name_ext = ".gif"; 
var num_images = 12; 

var framerate = 1; // Desired frames per second 
var frame_interval = 1000/framerate; 


$(function(){ 
    // Document is ready 
    // init arr of img names 
    for (i = 0; i <= num_images; i++) { 
     img_name_arr.push(img_name_root + i + img_name_ext); 
    } 


    var anim_interval = null; 
    var playing = false; 
    var anim_frame = 0; 

    // Define an interval that will execute every [frame_interval] milliseconds 
    $("#anim_control").on("click", function(e) { 
     e.preventDefault(); 
     if (playing == true) { 
      playing = false; 
      $(this).html("Start"); 
      clearInterval(anim_interval); 
     } else { 
      playing = true; 
      $(this).html("Stop"); 
      anim_interval = setInterval(function() { 
       //console.log(s + img_name_arr[(anim_frame++ % num_images)+1]); 
       $("#player").attr("src", s + img_name_arr[(anim_frame++ % num_images)+1]); 
      }, frame_interval); 
     } 
    }); 
}); 
</script> 

<style> 
#player { 
    width: 320px; 
    height: 240px; 
    border: 1px solid #000; 
} 
</style>