這是《Flex第一步》QQ羣裏面一個朋友問我的問題,特此拿出分享一下。或許問題比較簡單,還是將其記錄一下比較好。
需求如下:
當AIR啓動後,監聽全局鍵盤事件,即this.addEventListener( KeyboardEvent.KEY_DOWN, keydownHandler );
當AIR啓動後,監聽全局鍵盤事件,即this.addEventListener( KeyboardEvent.KEY_DOWN, keydownHandler );
運行後效果:
當AIR運行後,雖然正確監聽了KeyboardEvent.KEY_DOWN event,但是必須要鼠標點擊一下AIR纔可以獲取keydownHandler。
當AIR運行後,雖然正確監聽了KeyboardEvent.KEY_DOWN event,但是必須要鼠標點擊一下AIR纔可以獲取keydownHandler。
原因:
1、keydownHandler的獲取需要監聽的對象獲得焦點,當mouse click AIR後,則相當於獲取焦點。
2、只有當監聽的對象獲取焦點後,才能出接收到KeyboardEvent.KEY_DOWN event。
1、keydownHandler的獲取需要監聽的對象獲得焦點,當mouse click AIR後,則相當於獲取焦點。
2、只有當監聽的對象獲取焦點後,才能出接收到KeyboardEvent.KEY_DOWN event。
因此問題根結:
如何讓監聽對象自動獲取焦點。
如何讓監聽對象自動獲取焦點。
解決方案:(步驟)
1、
this.dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
通過以上的方式即可讓程序“自動點擊”dispatchEvent的對象。
1、
this.dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
通過以上的方式即可讓程序“自動點擊”dispatchEvent的對象。
2、
獲取焦點方式:
this.stage.focus = this;
獲取焦點方式:
this.stage.focus = this;
片段代碼如下:
<s:WindowedApplication
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
creationComplete="createCompleteHandler (event)">
<s:WindowedApplication
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
creationComplete="createCompleteHandler (event)">
private function createCompleteHandler( event : FlexEvent ) : void {
//監聽ouseEvent.CLICK event
this.addEventListener( MouseEvent.CLICK, clickHandler );
//監聽KeyboardEvent.KEY_DOWN
this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );
}
//監聽ouseEvent.CLICK event
this.addEventListener( MouseEvent.CLICK, clickHandler );
//監聽KeyboardEvent.KEY_DOWN
this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );
}
private function clickHandler( event : MouseEvent ) : void {
this.stage.focus = this;
}
this.stage.focus = this;
}
private function keyDownHandler( event : KeyboardEvent ) : void {
//TO DO
}
//TO DO
}
自動觸發mouse click的代碼:(以下代碼在this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );的下面)
var timer : Timer = new Timer( 100, 1 );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, function ( event : TimerEvent ) : void {
event.target.stop();
dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
});
timer.start();
之所以用timer來處理是因爲當create complete後,直接使用dispatchEvent會發現stage尚未賦值,因此需要延時一段時間處理。
注意:以上代碼適用於AIR,在Flex裏面按照如下寫法仍舊無法獲取KeyboardEvent.KEY_DOWN event。
var timer : Timer = new Timer( 100, 1 );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, function ( event : TimerEvent ) : void {
event.target.stop();
dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
});
timer.start();
之所以用timer來處理是因爲當create complete後,直接使用dispatchEvent會發現stage尚未賦值,因此需要延時一段時間處理。
注意:以上代碼適用於AIR,在Flex裏面按照如下寫法仍舊無法獲取KeyboardEvent.KEY_DOWN event。
Flex裏面是如何自動獲取焦點、監聽全局鍵盤事件的呢?
原因:
Flex由於有瀏覽器的包裹,因此當打開瀏覽器後,由於SWF尚未獲取焦點,因此就算自動獲取了焦點(dispatchEvent( new MouseEvent( MouseEvent.CLICK ));)也是沒有意義的。
Flex由於有瀏覽器的包裹,因此當打開瀏覽器後,由於SWF尚未獲取焦點,因此就算自動獲取了焦點(dispatchEvent( new MouseEvent( MouseEvent.CLICK ));)也是沒有意義的。
解決方法:
在嵌入SWF的html裏面加入如下的功能:
<body onload="document.getElementById('swf id').focus()">
這句話的含義:當onload完畢後,自動設定SWF爲焦點狀態。
在嵌入SWF的html裏面加入如下的功能:
<body onload="document.getElementById('swf id').focus()">
這句話的含義:當onload完畢後,自動設定SWF爲焦點狀態。
最後再按照AIR的寫即可完成自動獲取焦點、監聽全局鍵盤事件。
由於代碼比較少,因此就不放上demo了,以上的片段代碼足以說明問題:)