Murayama blog.

プログラミングと、その次の話

ドラッグアンドドロップ startDrag


続いて、ドラッグアンドドロップの2本目。
startDrag、stopDragメソッドを使用した例を試してみます。


AS3アニメ本には、

すべてのスプライトとムービークリップはstartDragとstopDragという名前のビルドインメソッドを持っています。


って書いてるんで、API見てみた。
Sprite - ActionScript 3.0 言語およびコンポーネントリファレンス
Spriteクラスに定義されてる。
でも、MovieClipクラスには定義されてない模様。。意味間違えてる??


まーいーや。


で、本題に入ると、
ドラッグ対象オブジェクトのmouseDownイベントで、対象オブジェクトのstartDragメソッドを呼び出す。
ステージのmouseUpイベントで、対象オブジェクトのstopDragメソッドを呼び出す。
そんなかんじでOK。



実行結果も前のサンプルと同じだけど載せとく。


コード。

package
{
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  import flash.geom.Rectangle;
  
  public class MouseMoveDrag2 extends Sprite
  {
    private var ball:Ball;
    
    public function MouseMoveDrag2()
    {
      init();
    }
    
    private function init():void{
      ball = new Ball;
      ball.x = 200;
      ball.y = 200;
      addChild(ball);
      ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown_ball);
    }
 
    private function onMouseDown_ball(evt:MouseEvent):void
    {
      
      stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp_stage);
      ball.startDrag();
    }
 
    private function onMouseUp_stage(evt:MouseEvent):void
    {
      stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp_stage);
      ball.stopDrag();      
    }
  }
}
import flash.display.Sprite;
 
class Ball extends Sprite
{
  private var radious:Number;
  private var color:uint;
  public var vx:Number;
  public var vy:Number;
 
  public function Ball(radius:Number = 40, color:uint = 0xff0000)
  {
    this.radious = radius;
    this.color = color;
    init();
  }
 
  private function init():void{
    graphics.beginFill(color);
    graphics.drawCircle(0, 0, radious);
    graphics.endFill();
  }
}


このやり方だと、ボールの中心以外をドラッグしても、マウスポインタは中心に移動しない。
どちらかといえば、自然なドラッグアンドドロップを実現できる。


mouseMoveの例と同じように、ドラッグした時にボールの中心を捉えるようにするには、

      ball.startDrag(true);

のように引数を指定します。デフォルトはfalseみたい。


また、ドラッグ可能な範囲を指定することもできます。

	// ドラッグ可能な範囲を設定
	var rec:Rectangle = new Rectangle(100,100, 200, 200);
	ball.startDrag(false, rec);


以上、ドラッグアンドドロップおしまい。