2012-02-09 66 views
0

我正在使用ActionScript 3和MXML实现的Flex 3应用程序,该应用程序包含嵌入式视频播放器,本质上是一个黑盒子 - 我将它作为SWF来自其他站点的需求,我无法访问其源代码。但是,它确实继承了Sprite。Flex 3:防止键盘事件到达Sprite

问题是,当焦点放在Flash应用程序上时,即使播放器本身没有焦点,视频播放器也会以某种方式接收和处理键盘事件。因此,当用户在GUI中的其他地方输入文本时,如果他们点击空格键,视频会暂停。

我试着拦截Sprite的父项中的关键事件,并在Sprite中设置tabEnabled = false,tabChildren = false和buttonMode = false,但似乎没有任何效果。就好像Sprite通过备用Event路径获取击键一样。

有没有人有任何关于如何防止播放器完全接收键盘事件或输入事件的想法?如果没有输入事件到达播放器,对我来说没问题,因为我已经实现了自己的独立视频控制。

+0

By *“尝试拦截Sprite的父项中的关键事件”*,您的意思是使用[useCapture]的事件侦听器(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/ events/EventDispatcher.html#addEventListener())设置为true? – merv 2012-02-09 19:13:11

+0

在黑暗中拍摄并可能无法解决它,但至少尝试另一件事,'yourPlayer.focusRect = false;' – ToddBFisher 2012-02-09 19:38:59

+1

关于@ wvxvw的评论如果是这种情况,您可以停止事件的传播通过为keyUp添加监听器,然后调用event.stopImmediatePropagation()来停止事件冒泡到舞台(您需要在所有输入上执行此操作,这显然不理想,但可能会起作用)。您也可以尝试在舞台上为最高优先级的keyUp设置监听器,并希望在播放器注册之前调用监听器,然后遵循相同的停止传播方法。 – shaunhusain 2012-02-09 19:57:35

回答

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 2012-02-10 17:20:29