この記事のURL

http://www.dango-itimi.com/blog/archives/2005/000698.html


FLASH tips 指定MCにダブルクリック通知機能を実装するクラス(setInterval版)

昨日作ったダブルクリック通知機能を実装するクラスのタイマー部分はsetInterval用いたら一行ですむことに気付き改変。MovieClip.getNextHigthestDepth()を用いないので深度管理の心配も無し。
問題がなければ タイマー関連はsetIntervalを用いたほうがよさそうですね。(setIntervalは設定した時間で画面が強制的に描画されてしまうのでしたっけ?)

ソース(tab:4,line:80で作成)→【 DoubleClick.as.2.txt 】

/* 指定MCにダブルクリック通知機能を実装するクラス */
class DoubleClick{

	/* フィールド */
	//通知用
	public var one   :Function; //シングルクリック時に実行される処理
	public var double:Function; //ダブルクリック成功時に実行される処理

	//処理用
	private var targetMC:MovieClip;
	private var timerID :Number;
	private var INTERVAL:Number = 500;//ダブルクリック間隔( ミリ秒 )

	/* コンストラクタ */
	public function DoubleClick( targetMC:MovieClip ){

		//フィールド設定
		this.targetMC = targetMC;

		//クリックされた場合の処理定義
		this.targetMC[ "scope" ] = this;
		this.targetMC.onPress 	 = this.click;
	}

	/* 対象MCがクリックされた場合の処理定義 */
	private function click():Void{

		//パス設定
		this = this[ "scope" ];
		var scope:DoubleClick = this;

		//シングルクリックされたことを通知
		this.one( { mc:this.targetMC } );

		//ダブルクリック時の処理定義
		this.targetMC.onPress = function(){
			scope.end( scope );
			scope.double( { mc:scope.targetMC } ); //ダブルクリック成功を通知
		};
		//タイマー開始
		this.timerID = setInterval( end, this.INTERVAL, this );
	}

	/* 破棄処理 */
	private function end( scope:DoubleClick ):Void{

		scope.targetMC.onPress = scope.click; //クリック時の処理 書き換え
		clearInterval( scope.timerID );		  //ループ処理終了
	}
}


使用例は前と同じです。

【 swf例 】
0.5秒以内にクリックが二度されるとダブルクリックと判定しています。
レッツ・クリック!

[ FLASH ] [ tips ] 投稿者 siratama : 2005年04月18日 11:41

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/661

コメント

はじめまして、いつもコッソリ覗かせて頂いております

クリック時に、前回クリック時からの差を利用して
ダブルクリックかどうかの判別をする手法もありかと(・∀・b

-------------------------------------
// ダブルクリック有効時間
private var holdTime:Number;

/* 対象MCがクリックされた場合の処理定義 */
private function click():Void{

//パス設定
this = this[ "scope" ];
var scope:DoubleClick = this;

// ダブルクリック有効時間内?
if(getTimer() < this.holdTime){
scope.double( { mc:scope.targetMC } )

// 次のクリックはダブルクリックじゃないヨ。
this.holdTime = getTimer()-1;
}else{
// シングルクリック処理
this.one( { mc:this.targetMC } );

// ダブルクリック有効時間を設定
this.holdTime = getTimer()+this.INTERVAL;
}
}


実際動かしてないのでエラーでるかもですがorz

投稿者 ise(QuR)age : 2005年04月18日 15:41

わあ、Flashに関するコメントだ。うれしいなあ。
どうも初めまして!

なるほどなるほど、holdTimeを有効時間+フラグ代わりに用いるのですね。ダブルクリック成功時、holdTimeが(現在時間-1)に設定されるため、次のクリックは必ずシングルクリックになると…!
おおお、こいつはすごいであります。勉強になります。ありがとうございます。
endメソッドもscopeの設定も必要なくなり全然いいですね!
もしかしたらgetTimer()-1は-1する必要はないでしょうか。
いやあ、こういった変数の振る舞いを作れる方ってすごいなあと思います。

投稿者 siratama : 2005年04月18日 17:24

まとめましたらこんなにシンプルになりました。

http://www.dango-itimi.com/blog/swf/6/DoubleClick.as.3.txt

うわ~い!
今までがなんだったのかというくらいシンプルに…!

投稿者 siratama : 2005年04月18日 17:39

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]