我正在开发一个Flex3应用程序,在Actionscript 3和MXML中实现,其中包括一个嵌入式视频播放器,它本质上是一个黑盒子 - 我根据需要从另一个站点加载它作为SWF,我不喜欢无法访问其源代码。但它确实从Sprite继承。
问题是,当焦点在Flash应用程序上时,视频播放器会以某种方式接收和处理键盘事件,即使播放器本身不在焦点上也是如此。因此,当用户在GUI中的其他位置键入文本时,如果他们点击空格键,则视频会暂停。
我已经尝试拦截Sprite父级中的键事件,并在Sprite上设置tabEnabled = false,tabChildren = false和buttonMode = false,但似乎没有任何效果。就像Sprite通过备用事件路径获得击键一样。
有没有人对如何阻止播放器完全接收键盘事件或输入事件有任何想法?如果没有输入事件到达播放器,那对我来说很好,因为我已经实现了我自己的独立视频控件。
答案 0 :(得分:4)
我的第一个直觉正是@wvxvw所说的。您正在使用的组件可能会在阶段级别侦听事件。我认为像这样添加事件监听器是封装原则的一个可怕的突破,听起来你已经继承了这个问题。
我尝试解决这个问题的方法是在事件到达舞台之前取消它们。由于您将此标记为Flex,因此在主应用程序中为keyUp和keyDown添加事件侦听器。
在事件监听器中,只需检查目标;如果它不是您的视频播放器的实例,那么stop propogation。
protected function keyUpListener(event:Event):void{
if(event.target == myVideoPlayerInstance){
return;
}
event.stopPropagation();
event.stopImmediatePropagation();
}
假设您的应用没有将任何其他keyUp / keyDown事件侦听器添加到舞台中,则此方法应该有效(理论上)。
如果您使用的视频组件在捕获阶段有事件,我不确定您是否有任何可以阻止它的事件。