減緩鍵盤連打事件的速度


在 Flash Player 內,使用者按下某一鍵盤按鍵不放
每隔 30~40 ms 就會連續送出鍵盤事件

以 Flex List 為例
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”horizontal” verticalAlign=”middle” preinitialize=”onPreinit();”>
<mx:Script>
<![CDATA[
[Bindable]
public var dataAry:Array = [];
public function onPreinit():void{
for (var i:Number = 0 ; i < 100 ; ++i) {
dataAry.push(i);
}
}
]]>
</mx:Script>
<mx:List width=”100″ height=”100%” dataProvider=”{dataAry}”/>
</mx:Application>
只要使用者在 List 上按下 Keyboard Down
按住不放持續一秒鐘,List 會被向下捲動 25~33 次左右
有時候,並不需要這麼頻繁的鍵盤事件
就可以利用 ActionScript 3.0 的事件功能加以攔截
以下面的程式為例,在 Applcation Capture Phase 攔截 KeyDown 事件
並紀錄最後一次 KeyDown 時間
假如下一個 KeyDown 時間太接近
便將該事件停止傳播
連續鍵盤事件大約會被減慢一半左右
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”horizontal” verticalAlign=”middle” preinitialize=”onPreinit();”>
<mx:Script>
<![CDATA[
public var minKeyDownInterval:Number = 100;
public var prevKeyDownTime:Number = 0;
[Bindable]
public var dataAry:Array = [];
public function onPreinit():void{
this.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown, true);
for (var i:Number = 0 ; i < 100 ; ++i) {
dataAry.push(i);
}
}
public function onKeyDown(evtObj:KeyboardEvent):void {
var currKeyDownTime:Number = getTimer();
if (currKeyDownTime - prevKeyDownTime > minKeyDownInterval) {
prevKeyDownTime = currKeyDownTime;
return;
} else {
evtObj.stopImmediatePropagation();
}
}
]]>
</mx:Script>
<mx:List width=”100″ height=”100%” dataProvider=”{dataAry}”/>
</mx:Application>

原文地址:https://www.cnblogs.com/appleseed/p/1292262.html