`

[Flex]Flex编程注意之自动获取焦点、监听全局键盘事件

 
阅读更多

http://www.k-zone.cn/zblog/post/flex-air-auto-set-focus.html

 

这是《Flex第一步》群里面一个朋友问我的问题,特此拿出分享一下。或许问题比较简单,还是将其记录一下比较好。

需求如下:
AIR启动后,监听全局键盘事件,即this.addEventListener( KeyboardEvent.KEY_DOWN, keydownHandler );

运行后效果:
AIR运行后,虽然正确监听了KeyboardEvent.KEY_DOWN event,但是必须要鼠标点击一下AIR才可以获取keydownHandler。

原因:
1、keydownHandler的获取需要监听的对象获得焦点,当mouse click AIR后,则相当于获取焦点。
2、只有当监听的对象获取焦点后,才能出接收到KeyboardEvent.KEY_DOWN event。

因此问题根结:
如何让监听对象自动获取焦点。

解决方案:(步骤)
1、
this.dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
通过以上的方式即可让程序“自动点击”dispatchEvent的对象。

2、
获取焦点方式:
this.stage.focus = this;

片段代码如下:
<s:WindowedApplication 
      xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/halo"
      creationComplete="createCompleteHandler (event)">

private function createCompleteHandler( event : FlexEvent ) : void {
      //监听ouseEvent.CLICK event
      this.addEventListener( MouseEvent.CLICK, clickHandler );
      //监听KeyboardEvent.KEY_DOWN
      this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );
}

private function clickHandler( event : MouseEvent ) : void {
      this.stage.focus = this;
}

private function keyDownHandler( event : KeyboardEvent ) : void {
      //TO DO
}

自动触发mouse click的代码:(以下代码在this.addEventListener( KeyboardEvent.KEY_DOWN, keyDownHandler );的下面)
var timer : Timer = new Timer( 100, 1 );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, function ( event : TimerEvent ) : void {
      event.target.stop();
      dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
});
timer.start();
之所以用timer来处理是因为当create complete后,直接使用dispatchEvent会发现stage尚未赋值,因此需要延时一段时间处理。
注意:以上代码适用于AIR,在Flex里面按照如下写法仍旧无法获取KeyboardEvent.KEY_DOWN event。

Flex里面是如何自动获取焦点、监听全局键盘事件的呢?

原因:
Flex由于有浏览器的包裹,因此当打开浏览器后,由于SWF尚未获取焦点,因此就算自动获取了焦点(dispatchEvent( new MouseEvent( MouseEvent.CLICK ));)也是没有意义的。

解决方法:
在嵌入SWF的html里面加入如下的功能:
<body onload="document.getElementById('swf id').focus()">
这句话的含义:当onload完毕后,自动设定SWF为焦点状态。

最后再按照AIR的写即可完成自动获取焦点、监听全局键盘事件。

由于代码比较少,因此就不放上demo了,以上的片段代码足以说明问题:)

 

分享到:
评论

相关推荐

    Flex 自动获取焦点 监听全局键盘事件

    ### Flex自动获取焦点与监听全局键盘事件 #### 一、背景介绍 在Flex开发中,自动获取焦点和监听全局键盘事件是两个常见的需求。尤其是在创建桌面应用或需要实时响应用户输入的应用场景中尤为重要。本文将详细介绍...

    flexevent.rar_flex

    本文将深入探讨Flex事件的基础知识、事件模型、事件生命周期、事件监听器,以及如何自定义事件,旨在帮助初学者理解和熟练运用Flex的事件处理。 一、Flex事件基础 1. 事件模型:Flex采用的是基于发布/订阅...

    flex 面试题flex

    【Flex面试题】Flex面试题主要涵盖Flex的基础概念、开发框架、MVC模式的应用、内存管理、垃圾回收机制、前端性能优化以及与后端通信等多个方面。以下是对这些知识点的详细解析: 1. AS2与AS3的区别: AS2...

    flex-event.zip_flex

    在Flex中,事件是用于传递信息的结构化对象,它们从一个源头(通常是组件)发送到其他感兴趣的接收者(监听器)。理解Flex事件的工作流程对于创建响应式和交互式的用户界面至关重要。 首先,让我们深入探讨Flex事件...

    FlexCAN详解

    FlexCAN(Flexible Controller Area Network)模块是一种实现了CAN(Controller Area Network)协议的通信控制器,即遵循CAN 2.0B协议规范。FlexCAN广泛应用于需要实时处理、可靠通信和成本效益的汽车串口总线系统中...

    Flex 应用内存泄露的分析与诊断

    Flex 使用 ActionScript 语言编写,其运行环境在 FlashPlayer 的 ActionScript Virtual Machine (AVM) 中,该虚拟机包含一个垃圾收集器用于自动管理内存。然而,尽管有垃圾收集器的存在,内存泄露仍然是一个挑战,...

    Flex面试题.pdf

    Flex面试题涉及到多个方面,包括ActionScript(AS)版本差异、Flex开发框架、MVC模式的应用、内存管理、垃圾回收机制、前后端交互、性能优化以及Flex与Flash的协同开发等核心知识点。以下是对这些内容的详细解释: ...

    flex4实现的简单相册实例

    5. **事件处理**:在相册应用中,用户可能会点击图片进行放大预览或者查看详细信息,这需要通过添加事件监听器和处理函数来实现。例如,使用`click`事件处理图片的点击行为。 6. **状态管理**:Flex4提供了一种强大...

    Flex multiple file uploader (Flex多文件上传范例)

    Flex是Adobe公司开发的一种基于ActionScript 3.0的开源框架,主要用于构建富互联网应用程序(RIA)。这个范例“Flex Multiple File Uploader”是利用Flex技术实现的一个支持多文件同时上传的功能组件。在Web应用中,...

    APE(flex out of memory)

    总之,解决"Out of memory-cannot load design mode"的问题需要深入理解Flex编程和内存管理,同时也需要熟悉所使用的开发工具的配置和限制。通过代码优化、调整IDE设置和保持软件更新,大多数情况下可以有效避免和...

    flex4学习资料

    8. **事件驱动编程**:Flex 4的事件模型对于理解程序交互至关重要。资料可能涵盖事件监听、派发和处理的基本概念。 9. **模块化开发**:Flex 4支持模块化,帮助开发者组织大型项目。资料可能解释如何创建和加载模块...

    Flex Module间通信

    3. **Flex内置服务**:Flex提供了一些内置的服务,如`Application.application`对象,它可以作为全局共享的存储区域,用于传递数据。另外,`ModuleManager`类允许对已加载和未加载的模块进行操作,包括获取模块引用...

    flex与flash cs 交互

    在Flash CS中,你需要为需要触发事件的对象添加事件监听器,并在事件触发时调用`ExternalInterface`暴露一个方法。例如,一个按钮的点击事件处理函数可能如下: ```as3 button.addEventListener(MouseEvent.CLICK, ...

    最新最全的FLEX++网站源码

    Flex是Adobe公司推出的一种开源框架,它允许开发者使用ActionScript编程语言和MXML标记语言来构建交互性强、图形界面丰富的Web应用。ActionScript是基于ECMAScript的一个方言,而MXML则是一种用于描述用户界面布局和...

    Flex框架Cairngorm经典案例源码

    2. **事件监听和分发**:使用EventDispatcher进行事件监听和分发,例如,当用户点击按钮时,会触发一个事件,命令类接收到该事件后进行处理。 3. **模型的创建和管理**:案例可能会展示如何创建和使用ModelLocator来...

    flex的mvc模式

    `Front Controller`是一个全局事件调度器,它捕获应用程序级别的事件并分派到相应的命令进行处理。例如,当用户执行某个操作时,控制器接收到事件,然后调用适当的命令对象来执行业务逻辑,更新模型,最终导致视图的...

    Flex垃圾回收机制

    尽管有垃圾回收机制,但开发者仍需要注意可能导致内存泄漏的问题,例如循环引用、事件监听器未正确移除、静态变量引用等。这些情况都可能导致对象无法被正确回收。 6. **优化策略** - 使用弱引用:弱引用不会增加...

    flex学习的资料文档

    本文将深入探讨Flex的基础知识、组件、样式设置、事件处理以及常见效果,帮助你全面了解和掌握Flex编程。 一、Flex基础 Flex提供了一个强大的开发环境——Flash Builder,它基于Eclipse,支持代码提示、调试和性能...

    Flex3+组件拖放教程

    `DragManager` 是Flex中全局的拖放管理器,负责处理所有的拖放操作,而`DragSource` 则是定义拖放源的类,它定义了被拖动的数据以及与之相关的视觉效果。 首先,要实现拖放操作,你需要设置一个可拖动的组件。这...

    教你怎样用FLEX做地图的教程

    这通常涉及到创建全局变量存储Point对象,以及添加地图的移动事件监听器,以便在地图移动时获取新的中心点坐标。这样,在用户点击按钮缩放地图时,可以使用当前地图的中心点坐标,确保缩放操作正确地围绕用户当前...

Global site tag (gtag.js) - Google Analytics