如何控制动画速度(请求动画帧)
How to control animation speed (requestAnimationFrame)?
我用requestAnimationFrame(animate);
函数更改文本颜色:
requestAnimationFrame(animate);
function animate(time){
... // change text color here
if (offset_s < offset_e) {requestAnimationFrame(animate);}
}
offset_s
和offset_s
指示文本的开始和结束位置以进行颜色更改。在某些情况下,动画应该持续 2 秒,但在顺序情况下 - 5 秒,但在这两种情况下offset_e - offset_s
可能是相同的。我该怎么做才能根据给定的秒/毫秒来控制动画的速度?
从问题的标签中,我只能看到您在画布上绘制了一些动画,这就是为什么您不能使用 css-animation 或 jquery-animation。
您必须通过计算时间差来控制动画的长度。
您可以像此示例类似地执行此操作
function start_animate(duration) {
var requestID;
var startTime =null;
var time ;
var animate = function(time) {
time = new Date().getTime(); //millisecond-timstamp
if (startTime === null) {
startTime = time;
}
var progress = time - startTime;
if (progress < duration ) {
if(offset_s < offset_e){
// change text color here
}
requestID= requestAnimationFrame(animate);
}
else{
cancelAnimationFrame(requestID);
}
requestID=requestAnimationFrame(animate);
}
animate();
}
触发动画并调用 start_animate(2000)//持续时间(毫秒) 1000=1 秒
您应该清楚地区分关注点。
运行单个 requestAnimationFrame,该帧计算当前动画时间并调用每个更新和绘制相关函数。
然后,您的动画将由处理当前动画时间的函数(如果您使用 OOP,则为类实例)处理。
只是代码的一些方向:
var animationTime = -1;
var _lastAnimationTime = -1;
function launchAnimation() {
requestAnimationFrame(_launchAnimation);
}
function _launchAnimation(time) {
animationTime = 0;
_lastAnimationTime = time;
requestAnimationFrame(animate);
}
function animate(time){
requestAnimationFrame(animate);
var dt = time - _lastAnimationTime ;
_lastAnimationTime = time;
animationTime += dt;
// here call every draw / update functions
// ...
animationHandler.update(animationTime);
animationHandler.draw(context);
}
要启动您的"引擎",只需调用launchAnimation
,然后您将有一个有效的animationTime
和dt
来处理。
我会animationHandler
一个AnimationHandler
类的实例,它允许添加/删除/更新/绘制动画。
我建议在JavaScript中使用setInterval函数。
requestAnimationFrame
真的需要一些"丑陋"的计算。不要相信我?向上滚动,您将看到...
因此,为了使setInterval
函数像rAF(requestAnimationFrame)一样方便,请将函数存储在变量中。下面是一个示例:
var gameLoop = setInterval(function() {
update();
draw();
if (gameOver)
clearInterval(gameLoop);
}, 1000/FPS);
给定的方式,您可以控制您的 FPS 并为您的对象选择正确的速度。
我通常会做类似的事情
ES6
constructor() {
this.draw();
}
draw() {
const fps30 = 1000 / 30;
const fps60 = 1000 / 60;
window.requestAnimationFrame(() => {
setTimeout(this.draw.bind(this), fps30);
});
}
ES5
function DrawingProgram() {
this.draw();
}
DrawingProgram.prototype.draw = function() {
var fps30 = 1000/30;
var fps60 = 1000/60;
var self = this;
window.requestAnimationFrame(function() {
window.setTimeout(function() {
self.draw(); // you could also use apply/call here if you want
}, fps30)
});
}
- 画布动画似乎不会以60帧/秒的速度运行
- 速度.js动画两个属性时持续时间不同
- 使用javascript的半仪表/速度表动画
- 动画速度滑块不工作
- 如何控制动画速度(请求动画帧)
- 基础 4 + 轨道滑块:无法控制动画速度
- 为什么每次删除和重新创建目标元素时动画速度都会增加
- 控制精灵动画速度
- 调整窗口大小后,画布动画速度加快
- 奇怪的IE与Firefox的Javascript动画速度
- jQuery自动页面滚动与HTML滑块控制动画速度
- 甜蜜警报JS库-修改动画速度
- 如何从页面底部的<链接滚动到#header DIV以及如何改变动画速度- JQuery 1.8.3
- jquery动画速度不变
- 画布动画速度
- 动画运行时更新动画速度
- 动画帧的动画速度如此之慢的原因是什么
- 动画速度问题
- 更改动画速度
- 使用 jQuery 更改动画速度