2011-04-22 54 views
2

因此,這裏是我的設置:AS3 KeyboardEvents不點火,直到我點擊了屏幕上的按鈕後

我的文檔類是Main.as(它擴展了影片剪輯)。以下代碼位於我的Main.as.

我已經宣佈所有這些變量在我的類定義:

private var holder:MovieClip; 
private var leftButton:SimpleButton; 
private var rightButton:SimpleButton; 
在構造

...

holder = new MovieClip(); 
addChild(holder); 
holder.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent); 

leftButton = new Arrow(); 
rightButton = new Arrow(); 

holder.addChild(leftButton); 
holder.addChild(rightButton); 

leftButton.x = 50; 
leftButton.rotation = 180; 
rightButton.x = 150; 

leftButton.y = rightButton.y = 50; 

leftButton.addEventListener(MouseEvent.CLICK, handlePaging); 
rightButton.addEventListener(MouseEvent.CLICK, handlePaging); 

...構造外...

public function handleKeyboardEvent (e:KeyboardEvent) { 
      trace("got a keyboard event"); 

       trace("e.charCode : " + e.charCode); 
       trace("e.keyCode : " + e.keyCode); 
       switch (e.keyCode) { 
        case 37: //left arrow 
         showPreviousMoment(); 
         break; 
        case 39: //right arrow 
         showNextMoment(); 
         break; 
       } 


     } 

這兩個按鈕是我在圖書館中使用的Arrow動畫片段的實例。箭頭影片剪輯僅包含圖形(在其屬性對話框中,基類爲flash.display.SimpleButton)。

我希望用戶能夠按下屏幕上的箭頭或鍵盤上的箭頭鍵來向前和向後翻頁。

因此......當我測試電影或將其發佈爲應用程序時,按下左右鍵盤鍵不會執行任何操作。但是......在我點擊屏幕箭頭後,鍵盤事件正在被拾起!我的鍵盤事件最初怎麼沒有收到?爲什麼點擊屏幕上的按鈕會使'持有人'開始接收事件?

UPDATE

我也只是註釋掉所有代碼除了實例化「持有人」並添加監聽器。 持有者未聽到KeyboardEvents。

UPDATE ... ANSWER

於是我發現,如果我想在全球範圍內聽到的KeyboardEvent,我要註冊舞臺監聽。所以,這並獲得成功:

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent); 

從科林·穆克的書信息:

觸發 應用範圍的命令 通常在全球範圍處理,通過與Flash 球員的註冊 監聽鍵盤輸入事件階段實例。相比之下,觸發 特定界面元素響應 的鍵盤輸入事件通常由向 當前具有鍵盤焦點的對象註冊的偵聽器 處理。

所以我想,在我最初的版本中,當我點擊屏幕上的箭頭按鈕,我不知何故給了鍵盤焦點的'持有人;。

+1

你確定它是點擊使鍵盤事件工作的箭頭,而不是單擊flash動畫中的任何東西嗎?因爲它聽起來像你需要讓閃光窗口處於焦點狀態才能使鍵盤事件起作用。嘗試單擊Flash影片中的其他內容(不是箭頭),然後測試點擊鍵盤箭頭,如果這有效,這意味着代碼沒有任何問題,並且所有內容都按照預期運行。 – SimplyZ 2011-04-22 19:03:54

+0

我忘了提及它不是焦點問題。我點擊了電影窗口的不同部分,並且不會「激活」按鍵。只有在點擊屏幕上的按鈕之後,按鍵纔會激活。 – milesmeow 2011-04-22 19:05:52

+0

您可以將handlePaging函數添加到問題中嗎?也許它是在那裏激活鍵盤事件的東西。 (只是一個瘋狂的猜測) – SimplyZ 2011-04-22 19:15:34

回答

4

通常情況下,您點擊的對象獲得焦點。這確實會影響聽衆,這就是爲什麼當你將它添加到舞臺上時它會起作用。

當你點擊其中的任何一個時,你的「持有者」對象獲得焦點,因此事件被解僱。現在你做得很好,你將它添加到了舞臺上。

+0

兩個主要屬性確定交互是否導致焦點更改。 mouseEnabled(false時)停止鼠標和鍵盤事件。假設mouseEnabled爲true,則任何InteractiveObject子類(TextFields,Sprite,MovieClips等)可以通過stage.focus屬性手動分配焦點。但是,默認情況下,除非「tabEnabled」設置爲true,否則對象(TextField和SimpleButton除外)在單擊時不會自動接收焦點。當buttonMode爲true時,tabEnabled變爲true。總之,tabEnabled的值決定了click還是tab可能會給出對象焦點。 – Triynko 2014-05-12 22:00:34

0

我發佈了基於@Ascension系統推薦的我自己問題的答案。我只是從我的更新複製到上面的問題。

UPDATE ... ANSWER

於是我發現,如果我想在全球範圍內聽到的KeyboardEvent,我要註冊舞臺監聽。所以,這並獲得成功:

stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyboardEvent); 

從科林·穆克的書信息:

觸發 應用範圍的命令 通常在全球範圍處理,通過與Flash 球員的註冊 監聽鍵盤輸入事件階段實例。相比之下,觸發 特定界面元素響應 的鍵盤輸入事件通常由向 當前具有鍵盤焦點的對象註冊的偵聽器 處理。

所以我想,在我最初的版本中,當我點擊屏幕上的箭頭按鈕時,我不知何故將鍵盤焦點給了'持有者'。

2

一個更動態的解決方案(比如,如果你動態的實例,它包含一個影片剪輯類)是使用:

stage.focus = this; 

所以,如果你申請的事件監聽器,實際上需要聽取關鍵的類實例事件,這可能對你更好。

對於我以前的建議沒有工作,因爲我在運行時添加我的主類實例。最後,我的代碼看起來像這樣:

Main.singletron.stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyDown); 
Main.singletron.stage.focus = this; 

......你將不得不爲這兩條線設置一個單一的工作。

+0

單子,大聲笑。它應該是singleTON https://en.wikipedia.org/wiki/Singleton_pattern – Triynko 2014-05-12 22:07:07