学习AsWing中实现双击(任意击)的原理

平时我们要实现一个双击效果,一般是用判断两次点击间隔时间是否小于指定值(一般是毫秒数),如果是的话就触发一个事件,如果间隔大于指定值就出发单击的事件。
在AsWing中使用了更巧妙的办法实现了双击或任意击并且只使用一个事件处理函数即可判断,当然主要也是通过判断时间间隔。
在AsWing的Component 基类中有个clickCount属性,用于记录连续点击的次数,每次点击后都会用当前时间和上一次点击时间 lastClickTime 做下比较,如果差值小于指定值 clickCount 就会累加一次 如果差值大于指定值就会将clickCount归1,然后将当前点击时间赋给 lastClickTime 用于下一次比较,每次 ON_CLICK事件触发时,都会将clickCount自动传给事件处理函数,这样只要在我们自定一的事件处理函数中判断clickCount参数的值就可以知道是多少击了。

btnObj.addEventListener(JButton.ON_CLICKED, clickHandle, this);
function clickHandle(target:JButton, clickCount:Number)
{
if(clickCount == customValue) // do something
}

[kml_flashembed movie="http://harryzhxu.googlepages.com/clickCount.swf" height="300" width="300" /]

import org.aswing.JButton;
import org.aswing.JFrame;
import org.aswing.JAdjuster;
 
import org.aswing.Container;
import org.aswing.SoftBox;
 
 
class ButtonTest extends JFrame
{
	private var button:JButton;
	private var adj:JAdjuster;
	private var flag:Boolean = false;;
 
	function ButtonTest(title:String)
	{
		super(title);
 
		this.button = new JButton("click me");
		this.button.addEventListener(JButton.ON_CLICKED, onClick, this);
 
 
		this.adj = new JAdjuster(10);
		this.adj.setMinimum(1);
		this.adj.setMaximum(10);
		this.adj.setValue(this.adj.getMinimum());
		this.adj.setValueTranslator(
								function(value:Number):String
								{
									return value+" 击后触发";
								}
							);
 
		var con:Container = SoftBox.createVerticalBox();
		con.append(button);
		con.append(adj);
		this.setContentPane(con);
	}
 
	private function onClick(src:JButton, clickCount:Number):Void
	{
		var pc:Number = this.adj.getValue();
		if(clickCount == pc)
		{
			src.setText(pc + " Clicked " + (flag ? "<>" : "><"));
			flag = !flag;
		}
	}
 
	//
	public static function main():Void
	{
		Stage.scaleMode = "noScale";
		var bt:ButtonTest = new ButtonTest("ButtonTest");
		bt.setClosable(false);
		bt.setSize(150, 100);
		bt.setLocation(50, 100);
		bt.show();
	}
 
}

评论