2012-02-09 6 views
0

基本的にブラックボックスである埋め込みビデオプレーヤーを含む、Actionscript 3とMXMLで実装されているFlex 3アプリケーションで作業しています。 SWFは必要に応じて別のサイトからダウンロードできますが、そのソースコードにアクセスすることはできません。ただし、Spriteを継承しています。Flex 3:キーボードイベントがスプライトに到達しないようにする

問題は、Flashアプリケーションにフォーカスがあると、ビデオプレーヤーが何らかの形でキーボードイベントを受信して​​処理していることです。プレーヤー自体にフォーカスがない場合でも問題です。だから、ユーザーがGUIのどこか別の場所にテキストを入力しているときに、スペースバーにヒットした場合、ビデオは一時停止します。

私はスプライトの親でキーイベントをインターセプトし、スプライトでtabEnabled = false、tabChildren = false、およびbuttonMode = falseを設定しようとしましたが、何も動作していないようです。スプライトが別のイベントパスを介してキーストロークを取得しているかのようです。

キーボードイベントを受け取ったり、イベントを完全に入力しないようにするには、どのようなアイディアがありますか?入力イベントがプレーヤーに届かない場合は、私自身で別々のビデオコントロールを実装しているので、私には問題ありません。

+0

*「Spriteの親のキーイベントを傍受しようとしました」とは、[useCapture](http://help.adobe.com/jp/FlashPlatform/reference/actionscript/3/flash/)のイベントリスナーを意味しますか? events/EventDispatcher.html#addEventListener())がtrueに設定されていますか? – merv

+0

暗闇の中で撮影し、それを解決しない可能性がありますが、少なくとも試してみるべきもう一つのことは、 'yourPlayer.focusRect = false;' – ToddBFisher

+1

@ wvxvwのコメントに関しては、入力ボックスにkeyUpのリスナーを追加し、event.stopImmediatePropagation()を呼び出してイベントがステージまでバブリングするのを止めます(これは明らかに理想的ではありませんが、動作する可能性があります)。また、最大優先度のkeyUpのステージ上にリスナーを設定してみると、プレーヤーによって登録されたものより前に呼び出され、同じ停止伝播メソッドに従うことをお勧めします。 – shaunhusain

答えて

4

私の最初の直感はまさに@wvxvwが言ったことです。使用しているコンポーネントは、おそらくステージレベルのイベントを待ち受けます。このようなイベントリスナーをカプセル化の原則に追加することを検討します。問題を継承したようです。

これを解決しようとする私の試みは、ステージに入る前にイベントをキャンセルすることです。これをFlexとタグ付けしたので、メインアプリケーションでkeyUpkeyDownのイベントリスナーを追加します。

イベントリスナーでは、ターゲットを確認するだけです。動画プレーヤーのインスタンスでない場合はstop propogationとなります。

protected function keyUpListener(event:Event):void{ 
if(event.target == myVideoPlayerInstance){ 
    return; 
} 
event.stopPropagation(); 
event.stopImmediatePropagation(); 
} 

あなたのアプリケーションにステージに追加された他のkeyUp/keyDownイベントリスナーがないと仮定すると、このアプローチは(理論上)機能するはずです。

使用しているビデオコンポーネントにキャプチャフェーズのイベントがある場合は、それを防ぐためにできることがあるかどうかはわかりません。

+1

これは私の問題を修正し、Flexイベントシステムの知識を広げました。ありがとう! – MattK

関連する問題