bug-a-lotによる解決策は興味深いです。私は優先度を使用するとは思わなかった。代わりに、私はイベントプロセスのさまざまな段階を利用しました。私の問題は、矢印キーが特定のテキストフィールド内の1文字を進めるか、後退させるか、フォームの次のまたは前のフィールドにジャンプするかどうかを決定することでした。
まず、私は、キーの取り扱いのステージのイベントをオーバーライドします。私は二回、各キーを処理します
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前に呼び出される)ので、I Flashがそれを動かす前と、システムがそれを処理した後に、キャレットがどこにあるのかを見ることができます(入力時に、KEY_UPの後に呼び出されます)。
getKeyStringは、これらのコードを便利なニーモニックに変換するものです。 isFocusInTextBoxはフォーカスマネージャへの呼び出しです。他のFlashの問題を解決するために標準フォーカスマネージャを置き換えました。私は、物がテキストフィールドかどうかを知る必要があります。
次は、Flashが既にキャレットを移動した後、新しいフィールドにジャンプした後にキーを処理しなければならず、以前の状態を見て、Flashが何を行ったのかを判断してから、起こる。私の関数 "typing"には、この議論には必要のないものがたくさんありますが、重要なことは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で作成しているので、TextInputの代わりにTextFieldを使用しています。 これを正しく動作させることができません。問題は、デフォルト動作の前にonAfterKeyDownが呼び出されているようです。 アイデア –
onAfterKeyDownを低い優先度で追加してもよろしいですか?それが問題になるとは思わないが、-10000よりも小さい数字を試してみてください。 –
はい、私は-10000とint.MIN_VALUEの両方で試しました。 –