您所在的位置 : IT客 » 程序開發 » Flex

[東華藝宗]Flex編程注意之自動獲取焦點、監聽全局鍵盤事件

當AIR啓動後,監聽全局鍵盤事件,即this.addEventListener( KeyboardEvent.KEY_DOWN, keydownHandler );

運行後效果: 當AIR運行後,雖然正確監聽了KeyboardEvent.KEY_DOWN event,但是必須要鼠標點擊一下AIR纔可以獲取keydownHandler。


原因: 1、keydownHandler的獲取需要監聽的對象獲得焦點,當mouse click AIR後,則相當於獲取焦點。 2、只有當監聽的對象獲取焦點後,才能出接收到KeyboardEvent.KEY_DOWN event。


因此問題根結: 如何讓監聽對象自動獲取焦點。


解決方案:(步驟) 1、 this.dispatchEvent( new MouseEvent( MouseEvent.CLICK )); 通過以上的方式即可讓程序“自動點擊”dispatchEvent的對象。


2、 獲取焦點方式: this.stage.focus = this;


片段代碼如下: view plaincopy to clipboardprint? <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 );   }     private function clickHandler( event : MouseEvent ) : void {         this.stage.focus = this;   }     private function clickHandler( event : KeyboardEvent ) : void {         //TO DO   }  <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 ); }


private function clickHandler( event : MouseEvent ) : void {       this.stage.focus = this; }


private function clickHandler( event : KeyboardEvent ) : void {       //TO DO }   自動觸發mouse click的代碼:(以下代碼在this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );的下面) view plaincopy to clipboardprint? 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();  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 ));)也是沒有意義的。


解決方法: 在嵌入SWF的html裏面加入如下的功能: <body onload="document.getElementByIdx_x('swf id').focus()"> 這句話的含義:當onload完畢後,自動設定SWF爲焦點狀態。


最後再按照AIR的寫即可完成自動獲取焦點、監聽全局鍵盤事件。

頂一下
(0)
踩一下
(0)

發表評論:

昵稱: *
內容:
驗證碼:
rss· 投稿· 加入收藏· 手機版