ドラッグアンドドロップ startDrag
続いて、ドラッグアンドドロップの2本目。
startDrag、stopDragメソッドを使用した例を試してみます。
AS3アニメ本には、
すべてのスプライトとムービークリップはstartDragとstopDragという名前のビルドインメソッドを持っています。
って書いてるんで、API見てみた。
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);
以上、ドラッグアンドドロップおしまい。