当前位置: 首页 > 编程日记 > 正文

浅析flex中的焦点focus

一、无焦点的困扰——组件监听不到键盘事件
原因:只有获得焦点的组件(确切说是InteractiveObject)才能监听到键盘事件的目标阶段;键盘事件(flash.events.KeyboardEvent)参与冒泡阶段,所以焦点组件的父项(以及它爸爸的爸爸的爸爸……)亦可在事件的冒泡阶段监听到该事件。
简单来说:只有组件本身或者其子孙项获得焦点后,才能监听到键盘事件。

二、获得焦点

1、设置焦点——setFocus()
Flex 的UIComponent 的setFocus() 方法可以设置焦点;调用此方法最终会将自身赋值给 systemManager.stage.focus
另外还可以采用focusManager.setFocus(IFocusManagerComponent) 给组件设置焦点;

2、 swf 获得焦点
如果swf嵌入到html中,首先要保证该swf在DOM中获得焦点;
  1. document.getElementById([swfId]).focus();
复制代码
为方便起见,可直接修改 flex 的模板 index.template.html;
  1. <body scroll="no" οnlοad=’document.getElementById("${application}").focus();’>
复制代码
(详见附件的模板文件

3、注意焦点转移
需要注意的时,随着swf与用户的交互 或者 弹出Alert窗框或者Popup组件、抑或是某些代码执行 都有可能引起焦点的转移;如果有需要便要采用setFocus() 重设焦点。 

4、鼠标点击获得焦点
——我更希望组件能够像TextInput那样鼠标点击即可获得焦点
——很简单监听 MouseEvent.MOUSE_DOWN 然后setFoucus() 即可;
——不!有更简单的,只需让你的组件实现 IFocusManagerComponent 接口即可。
UIComponent 已经实现了 IFocusManagerComponent 接口,只是没有显示的标明而已,所以需要某组件具有鼠标点击获得焦点的功能时,只需 显示声明 implements IFocusManagerComponent 即可。当然有特殊需求的还要覆盖某些方法,比方TextInput 就覆盖了 setFocus() 方法。(具体见源码。)
例如:让图片具有点击获得焦点特性:
  1. public class MyImage extends Image implements IFocusManagerComponent {
  2. public function MyImage() {        super();}
  3. }
复制代码
该例子详见附件。
下面会介绍 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被激活时,会给其管辖容器添加监听器:

  1. form.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
复制代码
监听器代码摘要:
  1. private function mouseDownHandler(event:MouseEvent):void    {

  2. if (event.isDefaultPrevented())     return;

  3. //从事件目标开始查找顶级的实现可设置焦点的组件 
  4. var o:DisplayObject = getTopLevelFocusTarget(
  5. InteractiveObject(event.target));

  6. if (!o)    return;       

  7. if ((o != _lastFocus || lastAction == "ACTIVATE") && !(o is TextField))
  8. setFocus(IFocusManagerComponent(o));                
  9. }
复制代码
/**
     *  从传入的对象开始向其父项方向查找顶级的实现可设置焦点的组件
     */
  1. private function getTopLevelFocusTarget (o:InteractiveObject):InteractiveObject   {

  2. //此处可以看到可设置焦点的组件需要满足的几个条件:
  3. while (o != InteractiveObject(form))  {
  4. if (o is IFocusManagerComponent &&
  5. IFocusManagerComponent(o).focusEnabled &&
  6. IFocusManagerComponent(o).mouseFocusEnabled &&
  7. (o is IUIComponent ? IUIComponent(o).enabled : true))
  8. return o;

  9. // if we cross a boundry into a bridged application, then return null so
  10. // the target is only processed at the lowest level
  11. if (o.parent is ISWFLoader)        {
  12. if (ISWFLoader(o.parent).swfBridge)
  13. return null; 
  14. }
  15. o = o.parent;

  16. if (o == null)
  17. break;       
  18. }
  19. return null;
  20. }
复制代码
受FocusManger管理的组件的几个条件:
1、实现 IFocusManagerComponent
2、focusEnabled、mouseFocusEnabled、enabled三个属性皆为true
3、bridge情况下(还不了解bridge,请高手指教)

转载于:https://www.cnblogs.com/programmer-wind/archive/2012/02/28/2919544.html

相关文章:

专访NIPS主席:如何保证论⽂评审的公平性?| 人物志

记者 | 阿司匹林编辑 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;作为人工智能领域顶会 NIPS&#xff08;Conference and Workshop on Neural Information Processing Systems&#xff0c; 更名为 NeurIPS&#xff09;的主席&#xff0c;Terrence Sejnowsk…

【H.265】H.265(HEVC)编码过程和名词解释

一、H.265(HEVC)编码过程 和H.264一样,H.265编码由帧内预测、帧间预测、量化、线性变换等步骤。过程大致如下; 1、分块 一帧画面首先被切分成多个互不重叠的块状区域,称为编码单元(H.264称为宏块),分别传输给编码器。 2、帧内预测 图像序列的第一个画面(以及每一个可…

为什么大家都推荐我学Linux

2019独角兽企业重金招聘Python工程师标准>>> 最近朋友总是推荐我去学Linux&#xff0c;我本人虽说是计算机专业的&#xff0c;但是我感觉在上学的时候好像还真没学到东西&#xff0c;现在也是干着一份与计算机半毛钱关系都没有的工作。朋友总是说Linux多好&#xff…

认识HTML5的WebSocket 认识HTML5的WebSocket

2019独角兽企业重金招聘Python工程师标准>>> 在HTML5规范中&#xff0c;我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术&#xff0c;以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法&#xff0c;从客户端…

空字符串计数、让字典可排序...Python冷知识(五)

本文转载自Python编程时光&#xff08;ID: Python-Time&#xff09;冷知识系列&#xff0c;直至今日&#xff0c;已经更新至第五篇。前四篇给你准备好了&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人…

后端说:只是你不懂怎么用 headers!

事情是这样的&#xff0c;上一个项目我们的后端提供的接口&#xff0c;一次性返回了所有数据给我&#xff0c;分页功能是前端自己完成的。 那么这次来的新项目&#xff0c;换了个后端&#xff0c;写了另外的接口&#xff0c;我做项目的时候&#xff0c;还是用的之前的前端分页组…

【H2645】H.264的宏块和H.265的编码树单元总结

一、H.264宏块 1、什么是宏块? 先看下面两张图,就能大体知道宏块指的是哪了。 将连续几帧图像分为一组(GOP)在H264中称为一个序列(sequence); 将每帧图像(Frame)划拉几道分成片(slice); 将每片(slice)按照16x16的大小横着竖着划拉成宏块(Maroblock); 将宏块(Maroblock…

android adb root方法

2019独角兽企业重金招聘Python工程师标准>>> 在有些android手机上使用adb root希望获取root权限时出现如下提示信息&#xff1a;adbd cannot run as root in production builds。此时提升root权限的方法是&#xff1a; 1。在android手机上获取超级用户权限&#xff…

10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...

译者 | linstancy作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan编辑 | 蓝色琥珀鱼&#xff0c;Rachel出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】本文提出了一种十亿级数据规模的半监督图像分类模型&#xf…

【Qt】QtCreator导入cmake工程

QtCreator导入cmake 一、ubuntu系统1、配置cmake编译套件2、导入cmake工程二、windows系统1、下载cmake2、安装cmake3、设置环境变量4、添加cmake5、配置kit6、编译时配置7、cmake选项配置8、编译后,执行安装命令一、ubuntu系统 1、配置cmake编译套件 在QtCreator中依次点击…

腾讯音乐招 iOS 开发, base 深圳,要求:本科、三年、OC,懂音视频开发优先。...

计算机基础扎实&#xff0c;精通 Objective-C&#xff0c;熟悉 iOS 平台并有良好的软件开发经验&#xff1b; 熟悉 https 及流媒体上传下载协议&#xff0c;精通 TCP/IP 协议&#xff1b; 良好的编码风格&#xff0c;以及足够的调试技术和问题解决能力&#xff1b; 责任心强&am…

Android深入浅出系列之Android工具的使用—模拟器(一)

前言  我们下载的SDK包里面有一个叫“Tools”的文件夹&#xff0c;里面为我们提供了许多与Android开发相关的工具&#xff0c;其中一些是必不可少的&#xff0c;现在我们就介绍一下模拟器 Android模拟器的创建  使用“Android SDK and AVD Manager”可以很方便的创建一个An…

【H2645】帧内预测

1、帧内预测的原理 帧内预测的原理&#xff1a;预测值是该像素周围像素值加权求和(比如平均值)P&#xff0c;它和实际值相减后得到的差值q&#xff0c;如果差值q很小&#xff0c;说明该像素的值可以通过预测得出&#xff0c;可以丢弃了&#xff0c;这就达到压缩编码的目的。当…

程序员神级跳槽攻略:什么时候该跳?做什么准备?到哪里找工作?

为什么80%的码农都做不了架构师&#xff1f;>>> 1、引言 每年的3、4月份都是求职高峰时期&#xff0c;目前已进入6、7月份了&#xff0c;你已经成功换工作了吗&#xff1f; 这次我们想聊的&#xff0c;就是程序员跳槽这件事儿&#xff0c;我打算从三个方面来说&…

周志华等人新著!国内第一部AI本科专业教育培养体系出炉

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;不得不感叹&#xff0c;南京大学在人工智能本科教育上的发展速度&#xff0c;确实比国内一众高校快一步。这一次&#xff0c;在AI 本科专业教育培养体系的制定上&#xff0c;南大又一次跑到了最前面。5 月 …

自己实现文本相似度算法(余弦定理)

2019独角兽企业重金招聘Python工程师标准>>> 最近由于工作项目&#xff0c;需要判断两个txt文本是否相似&#xff0c;于是开始在网上找资料研究&#xff0c;因为在程序中会把文本转换成String再做比较&#xff0c;所以最开始找到了这篇关于 距离编辑算法 Blog写的非…

autohotkey快捷键

;已经基本修复了输入带shift的时候跟输入法中英文切换之间的冲突 SetStoreCapslockMode, off SetKeyDelay, 50^CapsLock::#UseHook ;用这个和下面的off能实现代码不冲突,即这个区间的 才有作用,而不出发send right Send {Capslock} #UseHook off returnCapsLock:: Send {Right…

算法实现没思路?最全Python算法实现大礼包!(附学习资源)

整理 | Rachel责编 | Jane出品 | Python大本营&#xff08;ID&#xff1a;pythonnews&#xff09;【导语】数据结构与算法是所有人都要学习的基础课程&#xff0c;自己写算法的过程可以帮助我们更好地理解算法思路&#xff0c;不要轻视每一个算法&#xff0c;一些虽然看似容易&…

【H2645】帧间预测

1、帧间预测原理 先看下图,对比前后两帧图像,只有圆的位置发生变化,因此我们可以根据前一帧图像以及圆移动的信息,合成后一帧图像。这样少编码一帧图像,大大压缩了数据。 实际情况如下图,比对前后两帧,背景一样,只有两人身体发生微小变化,找出并记录这些变化信息,就…

企业网络翻译官——DNS

一、DNS简介 &#xff08;一&#xff09;、DNS原理 DNS 是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写。主要提供域名解析服务。将IP地址转换为相对应的域名&#xff0c;或者将域名解析为相应的IP地址。 &#xff08;二&#xff09;、DNS查询 DNS查询分…

【FFmpeg】AVPacket的使用详解

1、AVPacket简介 AVPacket是存储压缩编码数据相关信息的结构体,内部有压缩数据。它通常由解码器导出,或者作为输入传递给解码器,或者传递给muxers。 对于视频,它通常应该包含一个压缩帧。对于音频,它可能包含几个压缩帧。 重要的变量有以下几个: AVBufferRef *buf; 参…

GitHub日收12000星,微软新命令行工具引爆程序员圈!

作者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;继上次微软开源计算器刷爆GitHub后&#xff0c;今天凌晨在微软Build大会登场的Windows Terminal&#xff0c;如旋风般目前已登顶GitHub&#xff0c;截至发稿&#xff0c;收获超12000个Star&#xff0c;…

Codeforces 997 C - Sky Full of Stars

C - Sky Full of Stars 思路&#xff1a; 容斥原理 题解&#xff1a;http://codeforces.com/blog/entry/60357 注意当i > 1 且 j > 1&#xff0c;是同一种颜色 代码&#xff1a; #include<iostream> #include<cstdio> #include<queue> #include<deq…

jQuery中文入门指南,翻译加实例,jQuery的起点教程

中文版译者&#xff1a;Keel 此文以实例为基础一步步说明了jQuery的工作方式。现以中文翻译&#xff08;添加我的补充说明&#xff09;如下。如有相关意见或建议请 EMAIL 告知。或者在 BLOG中留言。 英文原版&#xff1a;http://docs.jquery.com/Tutorials:Getting_Started_wit…

从Pixel 3a到Android Q,一份谷歌AI能力的“成绩单” | Google I/O全程回顾

作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;当地时间 5 月 7 日上午&#xff08;北京时间 5 月 8 日凌晨一点&#xff09;&#xff0c;一年一度的 Google I/O 开发者大会如期而至。今年也是 Google 旗帜鲜明推行 “AI First” 战略的第四个年头。让我…

【超越白皮书3】DAG技术解析与实测

本报告由火币区块链研究院出品&#xff0c;作者&#xff1a;袁煜明、胡智威。原文地址 相关报告&#xff1a; 【超越白皮书2】EOS主网上线前夕的实测分析与技术建议 【超越白皮书1】EOSIO程序实测分析与技术建议 火币区块链应用研究院从技术角度对基于有向无环图&#xff08;DA…

【Live555】liveMedia下载、配置、编译、安装、基本概念

【Live555】live555源码详解系列笔记 一、下载、编译、安装 1、下载 官网地址:http://www.live555.com/ 下载地址:http://www.live555.com/liveMedia/public/ 2、配置、 源码目录下有已经写好的配置文件,如下 config.armlinux、 config.linux 、 config.linux-64bit …

更加安全的存取账户密码

苹果SDK自带的就有密码保护&#xff0c;使用方法很简单&#xff0c;如下&#xff1a; 1、引入Security.frameWork框架。2、引入头文件&#xff1a;SFHKeychainUtils.h.3、存密码&#xff1a;[SFHFKeychainUtils storeUsername:"dd" andPassword:"aa"forSer…

【C++】多态问题:基类调用子类的protected或者private函数

1、问题描述 如果在基类中虚函数是public&#xff0c;子类中重载时标记为protected或者private函数&#xff0c;是否还能访问这个函数&#xff1f; 答案是&#xff1a; 基类指针指向子类时&#xff0c;可以访问&#xff0c;并且访问的是子类重载后的函数&#xff1b; 子类指针…

Java接口对Hadoop集群的操作

Java接口对Hadoop集群的操作 首先要有一个配置好的Hadoop集群 这里是我在SSM框架搭建的项目的测试类中实现的 一、windows下配置环境变量 下载文件并解压到C盘或者其他目录。 链接&#xff1a;http://pan.baidu.com/s/1jHHPElg 密码&#xff1a;aufd 配置环境变量 1.配置HADOOP…