2010-12-05 32 views

回答

1

Adob​​e AS3 Alarm Clock example应该告诉你所有你需要知道的。特别是,setAlarm方法将是有趣的。

+0

如何将它编译成一个swc文件,以便我可以直接在我的flex项目中使用它? – fms 2010-12-05 16:04:13

+0

您只需在Flex项目中使用代码即可。你为什么要打包成SWC? – spender 2010-12-05 23:45:25

0

您可以使用日期对象 编辑 有人认为闪存可能会冻结一秒钟导致事件不火。这是有效的 - 我已经更新它,所以这不再是一个问题。

var currDate:Date = new Date(); 

var targetHour:int = 14; 
var targetMinute:int = 30; 

var startHour:int = currDate.getHours(); 
var startMinute:int = currDate.getMinutes(); 

var eventTriggered:Boolean = false; 

// you can use an enterframe or a timer event here, doesn't matter which 
addEventListener(Event.ENTER_FRAME, onCheckTime); 

function onCheckTime(evt:Event):void{ 
    currDate = new Date(); 

    var hours:int = currDate.getHours(); 
    var minutes:int = currDate.getMinutes(); 

    // in order for this not to work flash would need to freeze for an entire minute 
    // not likely 
    if (hours == 14 && minutes == 30){ 
    trigger(); 
    } 

    // if flash froze for a whole minute 
    if (!eventTriggered){ 
    if (startHour <= targetHour && startMinute < targetMinute){ 
     if (hours > targetHour && minutes > targetMinute){ 
     trigger(); 
     } 
    } 
    } 
} 
function trigger():void{ 
    // do anything you want here 
    eventTriggered = true; 
    dispatchEvent(new Event("eventX")); 
    removeEventListener(Event.ENTER_FRAME, onCheckTime); 
} 
0

使用日期()作为触发点的重复事件的原因提及并且是不可靠的,因为也Date类被绑定的本地机器的时间,这可以由用户来改变。虽然不太可能,但用户可以更改本地计算机上的日期,绝不允许它达到目标日期。

但是,如果你使用日期(),我可能接近它像下面这样,这将让你一分钟(或任何你设置timeOutLength变量),有触发( )叫。 其他块调用触发器()如果触发器窗口以某种方式传递,但不触发trigger()正在调用。其余的函数会创建一个等待期,直到触发器窗口过期,然后有一天向前滚动日期并重新启动该过程。

var timeOutLength:Number = 1; 
var minutesToWaitUntilReset:Number = timeOutLength + 1; 
var hasBeenTriggered:Boolean = false; 

var targetHour:Number = 2; 
var targetMinute:Number = 38; 

var currentYear:Number = new Date().getFullYear() 
var currentMonth:Number = new Date().getMonth(); 
var currentDay:Number = new Date().getDate(); 

addEventListener(Event.ENTER_FRAME, onCheckTime); 

function onCheckTime(evt:Event):void 
{ 
    var currentDate = new Date().getTime(); 
    var targetDate = new Date(currentYear, currentMonth, currentDay, targetHour, targetMinute).getTime(); 
    var timeOutDate = new Date(currentYear, currentMonth, currentDay, targetHour, (targetMinute + timeOutLength)).getTime(); 

    if (currentDate >= targetDate && currentDate < timeOutDate && hasBeenTriggered == false) 
    { 
     tiggerDailyEvent(); 
    } 
    else if(currentDate >= timeOutDate && hasBeenTriggered == false) 
    { 
     tiggerDailyEvent(); 
    } 
} 

function tiggerDailyEvent():void 
{ 
    hasBeenTriggered = true; 
    removeEventListener(Event.ENTER_FRAME, onCheckTime); 
    addEventListener(Event.ENTER_FRAME, waitForReset); 

    // this is where you call your daily event 
} 

function waitForReset(evt:Event):void 
{ 
    var currentYear = new Date().getFullYear(); 
    var currentMonth = new Date().getMonth(); 
    var currentDay = new Date().getDate(); 

    var currentDate = new Date().getTime(); 
    var resetDate = new Date(currentYear, currentMonth, currentDay, targetHour, (targetMinute + timeOutLength + minutesToWaitUntilReset)).getTime(); 

    if(currentDate >= resetDate) 
    { 
     removeEventListener(Event.ENTER_FRAME, waitForReset); 
     reset(); 
    } 
} 

function reset():void 
{ 
    hasBeenTriggered = false; 

    currentYear = new Date().getFullYear(); 
    currentMonth = new Date().getMonth(); 
    currentDay = new Date().getDate() + 1; 

    addEventListener(Event.ENTER_FRAME, onCheckTime); 
} 
相关问题