【问题标题】:Flex 3: Preventing keyboard events from reaching a SpriteFlex 3:防止键盘事件到达 Sprite
【发布时间】:2012-03-02 04:52:58
【问题描述】:

我正在开发一个用 Actionscript 3 和 MXML 实现的 Flex 3 应用程序,其中包括一个嵌入式视频播放器,它本质上是一个黑盒子——我根据需要从另一个站点将它作为 SWF 加载,但我没有'无权访问其源代码。但是,它确实继承自 Sprite。

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

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

有没有人对我可以如何阻止玩家完全接收键盘事件或输入事件有任何想法?如果没有输入事件到达播放器,这对我来说很好,因为我已经实现了自己的独立视频控件。

【问题讨论】:

  • “尝试在 Sprite 的父级中拦截关键事件”,您的意思是 useCapture 设置为 true 的事件侦听器吗?
  • 在黑暗中拍摄,可能无法解决问题,但至少可以尝试另一件事,yourPlayer.focusRect = false;
  • 关于@wvxvw 的评论,如果是这种情况,您可以通过为keyUp 添加监听器来停止输入框中的事件传播,然后调用event.stopImmediatePropagation() 来停止事件冒泡到舞台(您需要对所有输入都执行此操作,这显然不理想,但它可能会起作用)。您也可以尝试在舞台上为 keyUp 设置一个具有最高优先级的侦听器,并希望它会在播放器注册的侦听器之前被调用,然后遵循相同的停止传播方法。

标签: flash actionscript-3 apache-flex events mxml


【解决方案1】:

我的第一直觉正是@wvxvw 所说的。您正在使用的组件可能会监听舞台级别的事件。我认为添加这样的事件侦听器是对封装原则的可怕突破,听起来你已经继承了这个问题。

我解决这个问题的尝试是在事件上台之前取消它们。由于您将其标记为 Flex,因此在您的主应用程序中为 keyUpkeyDown 添加一个事件侦听器。

在事件监听器中,只检查目标;如果它不是您的视频播放器的实例,则stop propogation

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

假设您的应用没有向舞台添加任何其他 keyUp/keyDown 事件侦听器,这种方法应该有效(理论上)。

如果您使用的视频组件在捕获阶段有事件,我不确定您是否可以采取任何措施来阻止它。

【讨论】:

  • 这解决了我的问题并扩展了我对 Flex 事件系统的了解。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多