自前 Dragger #01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Flex フレームワークには、ドラッグ&ドロップ操作をサポートする DragManager が用意されていますが、タイトルの通りこれらの一切を無視して、自前のドラッグ機構を作り、応用するという Tips を今後数回に分けて解説します。今回は初回なので基本から。

お題「無限ドラッグ移動」

対象オブジェクトを制限なく座標移動させる機能を実装してみましょう。

ドラッグ処理のシーケンス

処理手順は次の通り、フローチャートに書き起こしてみました。

ドラッグ処理の概要

マウスダウン開始からマウスアップまでの間、ステージのマウスイベントをハンドリングして、マウスの移動量を制御するだけです。

実装コード (MXML)

<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx = "http://ns.adobe.com/mxml/2009"
xmlns:s  = "library://ns.adobe.com/flex/spark"
>

<fx:Script>
<![CDATA[
    protected var startMouseDownPoint:Point;
    protected var startTargetPoint:Point;
    protected override function createChildren():void {
        super.createChildren();
        startMouseDownPoint = new Point();
        startTargetPoint = new Point();
        dragArea.addEventListener(MouseEvent.MOUSE_DOWN, dragAreaMouseDownHandler);
    }
    protected function dragAreaMouseDownHandler(event:MouseEvent):void {
        startMouseDownPoint.x = stage.mouseX;
        startMouseDownPoint.y = stage.mouseY;
        startTargetPoint.x = target.x;
        startTargetPoint.y = target.y;
        stage.addEventListener(MouseEvent.MOUSE_UP, stageMouseUpHandler);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler);
    }
    protected function stageMouseUpHandler(event:MouseEvent):void {
        stage.removeEventListener(MouseEvent.MOUSE_UP, stageMouseUpHandler);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler);
    }
    protected function stageMouseMoveHandler(event:MouseEvent):void {
        var dx:Number = stage.mouseX - startMouseDownPoint.x + startTargetPoint.x;
        var dy:Number = stage.mouseY - startMouseDownPoint.y + startTargetPoint.y;
        target.move(dx, dy);
        event.updateAfterEvent();
    }
]]>
</fx:Script>

<s:BorderContainer
id               = "dragArea"
width            = "300"
height           = "300"
backgroundAlpha  = "1"
backgroundColor  = "0"
verticalCenter   = "0"
horizontalCenter = "0"
 />

<s:Group id="target" x="200" y="200">
<s:Button x="0"   y="0"   width="100" height="50" />
<s:Button x="300" y="0"   width="50" height="100" />
<s:Button x="0"   y="200" width="50" height="50" />
</s:Group>

</s:Application>

出力結果

出力結果は次の通り

This movie requires Flash Player 9

出力結果

次回は、少し応用を効かせたものを紹介します。