<![CDATA[
Flex中的键盘事件
要在Flex中响应键盘输入,只需注册keyDown事件即可。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" keyDown="OnKeyDown(event)">
<mx:Script>
private function OnKeyDown(event:KeyboardEvent):void
{
_Msg.text += "Ctrl:" + event.ctrlKey + ", Key:" + event.keyCode + "/n";
}
…
捕捉单键盘输入时keyDown事件能够很好的工作,但是,要处理组合键时keyDown事件就有问题了,例如:Ctrl+C,Ctrl键能够捕捉到,但C就失效了。
折中的办法,处理组合键时用keyUp事件。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" keyUp="OnKeyUp(event)">
<mx:Script>
private function OnKeyUp(event:KeyboardEvent):void
{
_Msg.text += "Ctrl:" + event.ctrlKey + ", Key:" + event.keyCode + "/n";
}
…
使用keyUp事件,虽然能够响应了组合键,但还是存在问题,按键不灵活,而且要Up时才触发事件,达不到一般软件的组合键效果,手感差。所以,需要从外部应用程序截获keyDown事件,再传给Flex。
真·组合键
Flex端
定义并注册OnExternalKeyDown方法,让外部应用程序调用,参数按实际情况进行设计。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="Init()">
<mx:Script>
private function Init():void
{
//注册外部方法
flash.external.ExternalInterface.addCallback("OnExternalKeyDown", OnExternalKeyDown)
}
private function OnExternalKeyDown(keyCode:uint, alt:Boolean, shift:Boolean, ctrl:Boolean):void
{
_Msg.text += "Ctrl:" + ctrl + ", Key:" + keyCode + "/n";
}
…
EXE端
为ShockwaveFlashObject控件注册PreviewKeyDown事件,并添加实现方法。
axShockwaveFlash1.PreviewKeyDown += new PreviewKeyDownEventHandler(axShockwaveFlash1_PreviewKeyDown);
…
void axShockwaveFlash1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
//注意:参数的顺序必须跟Flex所定义方法的参数顺序一致
StringBuilder sb = new StringBuilder();
sb.Append("<invoke name=/"OnExternalKeyDown/" returntype=/"xml/">");
sb.Append("<arguments>");
sb.Append("<number>").Append(e.KeyValue).Append("</number>");
sb.Append("<").Append(e.Alt.ToString().ToLower()).Append("/>");
sb.Append("<").Append(e.Shift.ToString().ToLower()).Append("/>");
sb.Append("<").Append(e.Control.ToString().ToLower()).Append("/>");
sb.Append("</arguments>");
sb.Append("</invoke>");
axShockwaveFlash1.CallFunction(sb.ToString());
}
运行EXE,按组合键,效果跟一般软件的组合键效果一样,手感回来了。
总结
Flex的键盘事件问题应该是flash player的Bug,Flex SDK官方上的大牛说目前无法解决,期待以后的版本吧。
这问题是细节问题,做事就要注重细节,时刻注重用户体现,追求用户体现才能开发出让用户满意的软件。
世界是平的,如果不平,就由自己来铲平。
.net在windows上的优势,不是AIR能够比拟的,相对的,flex/flash在呈现渲染上的技术沉淀也不是.net所比拟的,充分结合两种技术优势能够做出更完美的RIA软件。
系列索引
Flex通信篇——Flex和外部应用程序进行通信
Flex通信篇——Flex和外部进行异步通信
Flex通信篇——Flex键盘组合键
Flex通信篇——构建企业级HTTP通信层
]]>
分享到:
相关推荐
博文链接:https://hacker47.iteye.com/blog/182262
创建第一个Flex应用——设计模式创建第一个Flex应用——设计模式创建第一个Flex应用——设计模式
创建第一个Flex应用——编码模式创建第一个Flex应用——编码模式创建第一个Flex应用——编码模式
携程在线首页。适合零基础入门的人使用的demo,对布局这块有不错的...采用的是flex布局使用了原生js实现的tab栏切换等。自己可以通过swiper插件或者TouchSlide插件以及bootstrap框架来替换!可以把这个demo进行更改。
《精通Flex 3.0——基于ActionScript 3.0实现》一书源代码。 Flex 3.0 ActionScript 3.0源代码 Flex 3.0源代码。 --------------------------- 第1篇 Flex技术概述 第1章 Flex概述 3 1.1 Flex简介 3 1.2 Flex...
* 通过键盘方向键控制小熊(游戏主人翁)在迷宫内行走,在指定时间内拾取所有水果就通过游戏否不通过。 * 每次拾取水果必须正确回答问题才能够真正获取水果。 * 游戏中有敌人,道具等元素,增加游戏的趣味。 技术要点...
细细品味Flex——新Flex学习手册 技术齐全
NULL 博文链接:https://fykyx521.iteye.com/blog/403179
FLEX——blazeDS原理.pdfFLEX——blazeDS原理.pdf
精通Flex 3.0――14.1.1 LCDS与服务端通信方式介绍 精通Flex 3.0――14.1.2 ActionScript与Java数据类型的转换 精通Flex 3.0――14.1.3 LCDS的内容结构 精通Flex 3.0――14.2 一个最基本的LCDS应用 精通Flex 3.0――...
很好的解决了flex中的组合键问题,用户体验好,非常实用
Flex与Java实现通信,Flex与Java实现通信,Flex与Java实现通信
是学习 ArcGIS Flex 最佳资料源码,供初级人学习使用
博文链接:https://hacker47.iteye.com/blog/235758
flex界面布局和导航,flex各个控件的使用,布局的容器和布局的空间,详细的代码演示
微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——...
flex通信之BlazeDS通信实例源码