浅析flex中的焦点focus
发布时间:2020-12-15 05:14:31 所属栏目:百科 来源:网络整理
导读:一、无焦点的困扰—— 组件 监听不到键盘事件 原因:只有获得焦点的组件(确切说是InteractiveObject)才能监听到键盘事件的目标阶段;键盘事件( flash .events.KeyboardEvent)参与冒泡阶段,所以焦点组件的父项(以及它爸爸的爸爸的爸爸……)亦可在事件
一、无焦点的困扰——组件监听不到键盘事件
原因:只有获得焦点的组件(确切说是InteractiveObject)才能监听到键盘事件的目标阶段;键盘事件( flash .events.KeyboardEvent)参与冒泡阶段,所以焦点组件的父项(以及它爸爸的爸爸的爸爸……)亦可在事件的冒泡阶段监听到该事件。 简单来说:只有组件本身或者其子孙项获得焦点后,才能监听到键盘事件。 二、获得焦点 1、设置焦点——setFocus() Flex 的UIComponent 的setFocus() 方法可以设置焦点;调用此方法最终会将自身赋值给 systemManager.stage.focus 另外还可以采用focusManager.setFocus(IFocusManagerComponent) 给组件设置焦点; 2、?swf?获得焦点 如果swf嵌入到 html 中,首先要保证该swf在DOM中获得焦点; 为方便起见,可直接修改? flex ?的模板 index.template.html;
3、注意焦点转移 需要注意的时,随着swf与用户的 交互 ?或者 弹出Alert窗框或者Popup组件、抑或是某些代码执行 都有可能引起焦点的转移;如果有需要便要采用setFocus() 重设焦点。? 4、鼠标点击获得焦点 ——我更希望组件能够像TextInput那样鼠标点击即可获得焦点 ——很简单监听 MouseEvent.MOUSE_DOWN 然后setFoucus() 即可; ——不!有更简单的,只需让你的组件实现 IFocusManagerComponent 接口即可。 UIComponent 已经实现了 IFocusManagerComponent 接口,只是没有显示的标明而已,所以需要某组件具有鼠标点击获得焦点的功能时,只需 显示声明 implements IFocusManagerComponent 即可。当然有特殊需求的还要覆盖某些方法,比方TextInput 就覆盖了 setFocus() 方法。(具体见 源码 。) 例如:让 图片 具有点击获得焦点特性:
下面会介绍 IFocusManagerComponent 接口,并研究 究竟如何实现鼠标点击获得焦点的。 5、例外 如果只监听整个 应用 的键盘事件,不需具体到某个组件,可以考虑用给 stage添加监听,这样就不用考虑烦人的焦点问题。 三、介绍IFocusManagerComponent 见 API 文档,从focusManager.setFocus(IFocusManagerComponent) 顺藤摸瓜,某些组件已经实现了IFocusManagerComponent 接口。 包? ? ? ? mx.managers.IFocusManagerComponent Interface? ? ? ? public interface IFocusManagerComponent 实现器? ? ? ? Accordion,AdvancedListBase,Button,ButtonBar,ChartBase,ComboBase,DateChooser,DateField,HTML,ListBase,MenuBar,NumericStepper,TabNavigator,TextArea,TextInput,UIMovieClip IFocusManagerComponent 接口用于定义一些接口,可获得焦点的组件必须实现这些接口才能从 FocusManager 获得焦点。UIComponent 类中提供了此接口的基本实现,但 UIComponent 并不实现完整的 IFocusManagerComponent 接口,因为部分 UIComponent 无需获得焦点。因此,要使 UIComponent 派生的组件成为一个可获得焦点的有效组件,只需将“implements IFocusManagerComponent”添加到类定义即可。 四、鼠标按下获得焦点分析。 当FocusManager被激活时,会给其管辖容器添加监听器:
|