2/6 プロとして恥ずかしくないActionScript3.0 メモ

第3章7 ドラッグアンドドロップ

[cc lang="actionscript"] m_object.doubleClickEnabled = true; // ダブルクリックを許可している。 [/cc]

クリックをしたときの処理。 通常なにも設定をしないと、ダブルクリックをすれば、シングルクリックの処理も行ってしまうので下記のように設定をして分けています。 簡単に要約すると、シングルクリックをして0.18秒以内にクリックがなければシングルクリック。クリックがあればダブルクリックの処理を行うように設定しています。

[cc lang="actionscript"] //クリックをしたときの処理(シングルクリックとダブルクリックとでわけている) private function clickHandler(event:MouseEvent):void{

        callDelay(180,function():void{
                              
                                if(m_bDoubleClick){
                                    //ダブルクリックの処理
                                    createRipple(2);
                                }else{
                                  // ドラック中でない
                                    if(m_bDragging ==false){
                                        //シングルクリック
                                        createRipple(1);
                                    }
                                     //ドラック中でない
                                    m_bDragging = false;
                                }
                                });
        //ダブルクリックでない
        m_bDoubleClick = false;
    }

// ダブルクリックした際の処理 private function doubleClickHandler(event:MouseEvent):void{    m_bDoubleClick = true; } private function callDelay(delay:Number,func:Function):void{

     var timer:Timer = new Timer(delay,1); //delayで指定した時間の間隔で1回処理を行う。ディフォルトは0回なので無限にループする。
     //delayが 180で指定されているので180たったら、func()を含めた処理を行う
     //イベントディスパッチャーに無名関数を渡して登録した場合、破棄するときは関数の中で arguments.callee をパラメータにして removeEventListener を呼び出すと破棄出来るそうです。
     timer.addEventListener(TimerEvent.TIMER_COMPLETE,function(event:TimerEvent):void{
                                                                                event.target.removeEventListener(event:type,arguments.callee);
                                                                                timer.stop();
                                                                                func();
                                                                                });

     timer.start();
 }

[/cc]

var timer:Timer = new Timer(delay,1); //delayで指定した時間の間隔で1回処理を行う。ディフォルトは0回なので無限にループする。

今回のサンプルでは無名関数での処理がなされているので、イベントを消す際には arguments.callee をパラメータにして removeEventListener を呼び出しています。

その他の関数イベント [cc lang="actionscript"] // マウスが押して移動している際の処理 private function mouseMoveHandler(event:MouseEvent):void{ //マウスが押されていれば if(m_bmouseDown){

         var bounds:Rectangle = new Rectangle(50,50,450,300);
         //ドラッグ中
         m_bDragging = true;
         //boundsの範囲でドラック、startDrag()引数がtrueの場合はターゲットとなるMovieClipの中心がロックされます。falseの場合はドラックした所がロックされます。
         event.target.startDrag(false,bounds);

         m_object.addEventListener(MouseEvent.MOUSE.MOVE,rippleHandler);
     }
 }
 // マウスを離した際の処理
 private function mouseUpHandler(Event:MouseEvent):void{

     stopDragging(event.target);
 }
 // マウスを押した際の処理
 private function mouseDownHandler(Event:MouseEvent):void{

     m_bMouseDown = true;
 }

 // ステージの外で処理を行った場合
private function releaseOutsideHandler(event:MouseEvent):void{

    if(m_bDragging){

        stopDragging(m_object);
    }
}
// ドラックを停止した際の処理
private function stopDragging(target:Sprite):void{

    m_bMouseDown = false;
    target.stopDrag();

    m_object.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

}

[/cc]

startDrag()引数がtrueの場合はターゲットとなるMovieClipの中心がロックされます。falseの場合はドラックした所がロックされます。