这是另一种方法。这个想法是将当前开始时间存储一次。然后,每次您想更新时钟 (onTick) 时,您检查自开始时间以来已经过去了多少时间,并创建一个新的日期对象,该对象表示开始时间 + 所经过的时间,用一个因子缩放。如果因子大于 1,则时钟比实时移动得更快,如果它更低,则移动得更慢。
如果你经常运行 onTick,你会得到一个流畅的动画,但你可以每秒运行一次或任何你想要的间隔。
// store current start time in milliseconds
var startTime : Number = new Date().getTime();
// the delay in the Timer doesn't affect the time
// displayed by the clocks, but only determines
// how often the clocks should be updated (redrawn)
var ct:Timer = new Timer(50);
ct.addEventListener(TimerEvent.TIMER, onTick);
ct.start();
function onTick(event:TimerEvent):void {
// first clock should run at normal speed so we send in 1 as scale factor
var timeDataOne : Object = calculateTime(1);
// second clock at double speed (send in 0.5 to run at half speed)
var timeDataTwo : Object = calculateTime(2);
one_second_hand_mc.rotation = 180 + (timeDataOne.s * 6);
one_minute_hand_mc.rotation = 180 + (timeDataOne.m * 6);
one_hour_hand_mc.rotation = 180 + (timeDataOne.h/12) * 360;
two_second_hand_mc.rotation = 180 + (timeDataTwo.s * 6);
two_minute_hand_mc.rotation = 180 + (timeDataTwo.m * 6);
two_hour_hand_mc.rotation = 180 + (timeDataTwo.h/12) * 360;
}
function calculateTime(clockSpeed : Number = 1):Object {
// current time in milliseconds
var nowTime : Number = new Date().getTime();
// how many milliseconds have passed from the start time
var timePassed : Number = nowTime - startTime;
// create a new date object which should hold the time to display
var displayTime : Date = new Date();
// here we set the date object, which is based on the start time
// plus the time passed multiplied with a scale factor clockSpeed.
// When clockSpeed is one, displayTime will match the current time.
displayTime.setTime(startTime + timePassed * clockSpeed);
// calculate seconds, minutes and hours (and since the clock is analog
// we use Number so we don't get discreet steps for the clock hands)
var s : Number = displayTime.getSeconds() + (displayTime.getMilliseconds()/1000);
var m : Number = displayTime.getMinutes() + s / 60;
var h : Number = (displayTime.getHours() % 12) + m / 60;
return { s: s, m: m, h: h };
}