スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AdobeAirでポップアップをドラッグする

AdobeAirでポップアップウインドウを表示したときに、Panelのようなウインドウヘッダーが付いているコンポーネントならそこをドラッグすることで移動することができます。
しかし、BorderContainerのようなヘッダーが無い場合はマウスを自前で追いかけてウインドウを移動させる必要があります。
ちなみに、見栄え的にはBorderContainerの方が良いみたいですので、Panelを使うよりもお勧めです。以下のコードを組み込んで見栄えと使い勝手を両立してみてください。

// ドラッグ中かのフラグ
private var moveFlag:Boolean = false;

// クリック開始位置
private var clickX:int = 0;
private var clickY:int = 0;

// ウインドウ開始位置
private var startX:int = 0;
private var startY:int = 0;

// ドラッグ開始
private function dragMouseDown(event:MouseEvent):void
{
this.moveFlag = true;
this.clickX = event.stageX;
this.clickY = event.stageY;
this.startX = this.x;
this.startY = this.y;

// マウスキャプチャ
var root:DisplayObject = systemManager.getSandboxRoot();
root.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMove);
root.addEventListener(MouseEvent.MOUSE_UP, dragMouseUp);
}

// ドラッグ中
private function dragMouseMove(event:MouseEvent):void
{
if (this.moveFlag) {
this.x = this.startX - (this.clickX - event.stageX);
this.y = this.startY - (this.clickY - event.stageY);
}
}

// ドラッグ終了
private function dragMouseUp(event:MouseEvent):void
{
this.moveFlag = false;
}

// ドラッグ処理をしない
private function mouseDownStopPropagation(event:MouseEvent):void
{
event.stopPropagation();
}

BorderContainerのmouseDownのイベントハンドラーにdragMouseDownを設定してください。
しかし、この設定のままだとポップアップウインドウ上のどこをクリックされても、ウインドウのドラッグが発生してしまいます。
もし、テキストエリアやボタンなどドラッグしてほしくないコンポーネントがあるならば、そのコンポーネントのmouseDownのイベントハンドラーにmouseDownStopPropagationを設定してください。
これで、上位のコンポーネントにイベントが通知されなくなります。

ちなみにmouseMoveとmouseUpをBorderContainerのイベントでやってしまうと、マウスを大きく動かしたときにドラッグが途中で切れてしまい使い勝手が悪いです。
そこで、アプリケーション全体のマウスの動作をキャプチャして、イベントハンドラーを設定しています。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。