zoukankan      html  css  js  c++  java
  • Flex编程注意之自动获取焦点、监听全局键盘事件

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

     

    详细请看:http://www.k-zone.cn/zblog/post/flex-air-auto-set-focus.html
    这是《Flex第一步QQ群里面一个朋友问我的问题,特此拿出分享一下。或许问题比较简单,还是将其记录一下比较好。

    需求如下:
    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 clickHandler( 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了,以上的片段代码足以说明问题:)

  • 相关阅读:
    Python中最常见的10个列表操作
    使用Mac的texturetool将图片转换为PVRTC格式
    Android、iOS复制到粘贴板
    Python
    Pytest 作业
    Jmeter系列(34)- 详解 Jmeter CLI 模式
    Jmeter系列(33)- Jmeter 分布式测试
    Jmeter系列(32)- 详解性能监控工具 nmon
    Jmeter系列(31)- 详解 ForEach控制器
    Jmeter系列(30)- 详解 Loop Controller 循环控制器
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/1648276.html
Copyright © 2011-2022 走看看