由bug-a-lot解決方案很有趣 - 我沒有想到要使用優先級。相反,我利用了事件過程的不同階段。對我來說,問題是要決定箭頭鍵是否應該在給定的文本字段內前進或後退一個字符,或跳轉到表單中的下一個或上一個字段。
首先,我重寫階段的事件處理的按鍵:
stage.addEventListener(KeyboardEvent.KEY_UP, typing);
// Sneak in before the normal processing handles right and left arrow keystrokes.
stage.addEventListener(KeyboardEvent.KEY_DOWN, pretyping, true, 10);
注意,我會兩次處理每一個按鍵 - 該系統確實之前它的魔力(pretyping是KEY_DOWN之前調用),所以我可以在Flash移動之前看到插入符號的位置,然後在系統處理之後(鍵入KEY_UP之後調用)。
/** Capture prior state of text field so we can later tell if user should tab to next field or previous field. */
private function pretyping(evt:KeyboardEvent):void {
var keyString:String = Configuration.getKeyString(evt);
if (isFocusInTextBox()) {
var tf:TextField = getFocus() as TextField;
capturePhaseCaret = tf.caretIndex;
}
}
getKeyString是我的一個方法 - 它所做的就是將這些代碼轉換爲便捷的助記符。 isFocusInTextBox是對我的焦點經理的調用 - 我替換了標準焦點管理器以克服其他Flash問題。我只需要知道這東西是否是文本字段。
接下來,我必須在Flash已經移除插入符後才能處理密鑰,甚至可以跳到新字段,並通過查看以前的狀態,決定Flash執行的操作並撤消它,然後執行應執行的操作發生。我的函數「打字」有很多這個討論不需要的東西,但它所做的重要事情是調用allowKeyMapping。 allowKeyMapping決定用戶是否從文本字段的最後一個字符位置輸入向前箭頭(或向下箭頭),或從頭開始輸入向後箭頭。如果是這樣,「打字」將分別標籤到下一個或前一個字段。
/** Prefer default behavior and do not allow certain kestrokes to be reinterpreted by key mappings, such as left and right cursor keys in text boxes. */
private function allowKeyMapping(keyString:String) {
var allow:Boolean;
// If focus is in a text field, allow right arrow to advance to next field only if caret is at end of text.
// Conversely, allow left arrow to back up to previous field only if caret is at beginning of text.
// The trick is that the normal processing of keystrokes by TextFields occurs before this method is called,
// so we need to know the caret position from before the key was pressed, which we have stored in capturePhaseCaret, set in pretyping.
if (isDragging) {
allow = false;
}
else if (isFocusInTextBox()) {
var tf:TextField = getFocus() as TextField;
if (keyString == Configuration.LEFT_CURSOR_KEY) {
allow = tf.caretIndex == 0 && capturePhaseCaret == 0;
}
else if (keyString == Configuration.RIGHT_CURSOR_KEY) {
allow = tf.caretIndex == tf.text.length && capturePhaseCaret == tf.text.length;
}
else {
allow = true;
}
}
else {
allow = true;
}
return allow;
}
對不起,我沒有準備好一個簡潔的例子。我認爲重要的是要強調,無論您是否希望它們發生,您都可以繞過Flash的偏好來爲您做事。
我在Flash中,所以我使用TextField而不是TextInput。 我無法讓這個工作正常,問題似乎是onAfterKeyDown在默認行爲之前被調用。 有什麼建議嗎? – 2009-06-23 12:16:27
您確定要添加低優先級的onAfterKeyDown嗎?嘗試一個比-10000更低的數字,但我認爲這不是問題。 – 2009-06-23 12:28:35
是的,我試着-10000和int.MIN_VALUE。 – 2009-06-24 08:53:21