Flex通信篇——Flex键盘组合键

<![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通信层

        ]]>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值