指定MCにダブルクリック通知機能を実装するクラス
ROOM FlashのPCチェック時 OS画面上に表示されるアイコンの実行形式をダブルクリックにするため、ダブルクリック処理を実装するためのクラスをライブラリとして作成。
ミスやもっとスマートな書き方ありましたら教えてください。ソース内のコメントはここでは部分的に掲載。
ソース(tab:4,line:80で作成)→【 DoubleClick.as.txt 】
/* 指定MCにダブルクリック通知機能を実装するクラス */ class DoubleClick{ /* フィールド */ //通知用 public var one :Function; //シングルクリック時に実行される処理 public var double:Function; //ダブルクリック成功時に実行される処理 //処理用 private var targetMC:MovieClip; private var empMC :MovieClip; 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.double( { mc:scope.targetMC } ); //ダブルクリック成功を通知 }; //空MC作成 this.empMC = this.targetMC.createEmptyMovieClip( "empMC", this.targetMC.getNextHighestDepth() ); //タイマー開始 var firstTime:Number = getTimer(); this.empMC.onEnterFrame = function(){ //指定時刻を経過した場合 : 破棄処理 if( getTimer() - firstTime >= scope.INTERVAL ){ scope.end(); } }; } /* 破棄処理 */ private function end():Void{ //targetMCクリック時の処理 書き換え this.targetMC.onPress = this.click; //ループ処理終了 delete this.empMC.onEnterFrame; this.empMC.removeMovieClip(); } }
【 使用例 】
ダブルクリック機能を適用したいムービークリップ(targetMC)のパスをDoubleclickクラスの引数に渡し、そのMCがクリックされた場合の処理を DoubleClick.oneに、ダブルクリックされた場合の処理を DoubleClick.doubleに設定します。
var doubleObj:DoubleClick = new DoubleClick( targetMC ); doubleObj.one = function( event:Object ){ trace( "クリック" ); }; doubleObj.double = function( event:Object ){ trace( "ダブルクリック" ); };
微妙な注意点はcreateEmptyMovieClipの深度をgetNextHighestDepth()で取得している点。引数で渡した対象MC内にUI Componentsのコンポーネントが含まれている場合↓のような問題があるようです。普通は気にする必要はなさそうですね。
意外と使えないMovieClip.getNextHighestDepth() 【F-site】
【 swf例 】
0.5秒以内にクリックが二度されるとダブルクリックと判定しています。
レッツ・クリック!
【 改変ver. 】
タイマー測定部分をsetInterval用いたものに修正
もしかして時間測定部分はsetInterval用いたほうがいいのかもしれない。
投稿者 siratama : 2005年04月18日 11:18