ein*_*ein 49 javascript animation requestanimationframe
我是动画新手,但我最近用动画制作了动画setTimeout.FPS太低了,所以我找到了一个使用的解决方案requestAnimationFrame,在此链接中有所描述.
到目前为止,我的代码是:
//shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
return
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
};
})();
(function animloop(){
//Get metrics
var leftCurveEndX = finalLeft - initialLeft;
var leftCurveEndY = finalTop + finalHeight - initialTop;
var rightCurveEndX = finalLeft + finalWidth - initialLeft - initialWidth;
var rightCurveEndY = leftCurveEndY;
chopElement(0, 0, 0, 0, leftCurveEndX, leftCurveEndY, rightCurveEndX, rightCurveEndY);//Creates a new frame
requestAnimFrame(animloop);
})();
Run Code Online (Sandbox Code Playgroud)
这在第一帧期间停止.我在函数requestAnimFrame(animloop);中有一个回调chopElement函数.
此外,是否有更全面的指南使用此API?
Jan*_*Jan 79
警告!这个问题不是关于垫片的最佳方法 requestAnimFrame.如果您正在寻找,请转到此页面上的任何其他答案.
你被自动分号插入欺骗了.试试这个:
window.requestAnimFrame = function(){
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
}
);
}();
Run Code Online (Sandbox Code Playgroud)
javascript会自动在您的return语句后面添加分号.这样做是因为它后跟换行符,下一行是有效的表达式.实际上它被翻译成:
return;
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
};
Run Code Online (Sandbox Code Playgroud)
此代码返回undefined并且从不执行return语句后面的代码.所以window.requestAnimFrame是undefined.当你调用它时animloop,javascript会产生错误并停止执行.您可以通过将表达式括在括号中来解决问题.
我可以推荐Chrome开发人员工具或firebug来检查javascript执行情况.使用这些工具,您会看到错误.您应该按照以下方式调试它(我假设Chrome):
未捕获的TypeError:对象[对象DOMWindow]的属性'requestAnimFrame'不是函数
window.requestAnimFrame输入控制台:按Enter键,您将看到它undefined.到目前为止,您知道问题实际上与requestAnimationFrame您无关,并且您应该专注于代码的第一部分.此外,观看此视频,了解编写javascript的一些好习惯,他还提到了邪恶的自动分号插入.
/*
Provides requestAnimationFrame in a cross browser way.
http://paulirish.com/2011/requestanimationframe-for-smart-animating/
*/
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = (function() {
return window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame || // comment out if FF4 is slow (it caps framerate at ~30fps: https://bugzilla.mozilla.org/show_bug.cgi?id=630127)
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
window.setTimeout(callback, 1000 / 60);
};
})();
}
animate();
function animate() {
requestAnimationFrame(animate);
draw();
}
function draw() {
// Put your code here
}
Run Code Online (Sandbox Code Playgroud)
看看下面的jsfiddle例子; 它清楚地说明了我的意思;
http://jsfiddle.net/XQpzU/4358/light/
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
51492 次 |
| 最近记录: |