我有一个 PSD 文件,其中包含一堆作为动画帧的图层。如何使用 JQuery/JavaScript 从中创建动画?
我是否必须将每个图层保存为单独的图像,有没有办法让具有多个图层的一个图像动画?澄清一下,我不希望实际图像移动,我只想显示不同的图层,就好像它们是动画的帧一样。使用 JavaScript 完成此操作的标准方式是什么?
谢谢!
我有一个 PSD 文件,其中包含一堆作为动画帧的图层。如何使用 JQuery/JavaScript 从中创建动画?
我是否必须将每个图层保存为单独的图像,有没有办法让具有多个图层的一个图像动画?澄清一下,我不希望实际图像移动,我只想显示不同的图层,就好像它们是动画的帧一样。使用 JavaScript 完成此操作的标准方式是什么?
谢谢!
这是一个演示 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 中,间隔会定期执行。您指定要执行的代码以及代码应该运行的时间间隔(以毫秒为单位)。
每次调用间隔时,您可以通过将图像标签的“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>