ドラッグインジェスチャのサポート

Adobe AIR 1.0 およびそれ以降

ドラッグインジェスチャをサポートするには、アプリケーション(より一般的にはアプリケーションのビジュアルコンポーネント)が nativeDragEnter イベントまたは nativeDragOver イベントに応答する必要があります。

一般的なドロップ操作の手順

ドロップ操作の一般的なイベントシーケンスを次に示します。

  1. ユーザーがコンポーネント上にクリップボードオブジェクトをドラッグします。

  2. コンポーネントによって nativeDragEnter イベントが送出されます。

  3. nativeDragEnter イベントハンドラーがイベントオブジェクトを調べて、使用可能なデータ形式と許可されたアクションを確認します。コンポーネントがドロップを処理できる場合は、 NativeDragManager.acceptDragDrop() が呼び出されます。

  4. NativeDragManager によって、オブジェクトがドロップ可能であることを示すようにマウスカーソルが変更されます。

  5. ユーザーがコンポーネント上にオブジェクトをドロップします。

  6. ドロップ先のコンポーネントによって nativeDragDrop イベントが送出されます。

  7. ドロップ先のコンポーネントがイベントオブジェクト内の Clipboard オブジェクトから必要な形式でデータを読み取ります。

  8. ドラッグジェスチャが AIR アプリケーション内で開始された場合、ドラッグ元のインタラクティブオブジェクトによって nativeDragComplete イベントが送出されます。ジェスチャが AIR の外部で開始された場合、フィードバックは送信されません。

ドラッグインジェスチャの確認

ユーザーがビジュアルコンポーネントの境界内にクリップボードオブジェクトをドラッグすると、そのコンポーネントによって nativeDragEnter イベントと nativeDragOver イベントが送出されます。これらのイベントのハンドラーでは、イベントオブジェクトの clipboard プロパティと allowedActions プロパティを調べて、コンポーネントがクリップボードアイテムを受け入れ可能かどうかを確認できます。イベントハンドラーでは、コンポーネントがドロップを受け入れ可能であることを通知するために、 NativeDragManager.acceptDragDrop() メソッドを呼び出して、ドロップ先のコンポーネントに参照を渡す必要があります。複数の登録済みイベントリスナーが acceptDragDrop() メソッドを呼び出した場合、リストの最後のハンドラーが優先されます。 acceptDragDrop() メソッドは、マウスがドロップ先オブジェクトの境界から離れて nativeDragExit イベントが発生するまで有効のままです。

doDrag() に渡される allowedActions パラメーターで複数のアクションが許可されている場合、ユーザーは、修飾キーを押すことで、実行するアクションを指定できます。ドラッグマネージャーは、ドロップが完了した場合に実行されるアクションをユーザーに通知するために、カーソルのイメージを変更します。目的のアクションは、NativeDragEvent オブジェクトの dropAction プロパティで報告されます。ドラッグジェスチャのアクションセットは報告のみです。移動に関連するコンポーネントには、適切な動作を実装する必要があります。例えば、移動アクションを完了するために、ドラッグイニシエータがドラッグされたアイテムを削除し、ドロップターゲットがそのアイテムを追加する場合があります。

NativeDragManager クラスの dropAction プロパティを設定することで、ドラッグターゲットのドロップアクションを、実行可能な 3 つのアクションのいずれかに制限できます。ユーザーがキーボードを使用して別のアクションを選択しようとした場合、NativeDragManager によって 使用不可 カーソルが表示されます。ハンドラーの dropAction プロパティを nativeDragEnter イベントと nativeDragOver イベントの両方に設定します。

次の例は、 nativeDragEnter イベントまたは nativeDragOver イベントのイベントハンドラーを示しています。ドラッグ中のクリップボードにテキスト形式のデータが含まれている場合、このハンドラーはドラッグインジェスチャのみを受け入れます。

import flash.desktop.NativeDragManager; 
import flash.events.NativeDragEvent; 
 
public function onDragIn(event:NativeDragEvent):void{ 
    NativeDragManager.dropAction = NativeDragActions.MOVE; 
    if(event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){ 
        NativeDragManager.acceptDragDrop(this); //'this' is the receiving component 
    } 
}

ドロップの完了

ユーザーがジェスチャを受け入れたインタラクティブオブジェクトにドラッグしたアイテムをドロップすると、そのインタラクティブオブジェクトによって nativeDragDrop イベントが送出されます。このイベントのハンドラーは、イベントオブジェクトの clipboard プロパティからデータを取得できます。

クリップボードにアプリケーション定義の形式が含まれている場合、Clipboard オブジェクトの getData() メソッドに渡される transferMode パラメーターによって、ドラッグマネージャーが参照または直列化されたオブジェクトのどちらを返すかが決定されます。

次の例は、 nativeDragDrop イベントのイベントハンドラーを示しています。

import flash.desktop.Clipboard; 
import flash.events.NativeDragEvent; 
 
public function onDrop(event:NativeDragEvent):void { 
    if (event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) { 
    var text:String = 
        String(event.clipboard.getData(ClipboardFormats.TEXT_FORMAT,  
                                    ClipboardTransferMode.ORIGINAL_PREFERRED)); 
}

イベントハンドラーが呼び出されると、Clipboard オブジェクトは無効になります。オブジェクトまたはそのデータにアクセスしようとすると、エラーが発生します。

コンポーネントの外観の更新

NativeDragEvent イベントに基づいてコンポーネントの外観を更新できます。一般的なコンポーネントが様々なイベントに応じて行う変更の種類を次の表に示します。

イベント

説明

nativeDragStart

ドラッグ元のインタラクティブオブジェクトでは、 nativeDragStart イベントを使用して、そのインタラクティブオブジェクトからドラッグジェスチャが開始されたことを示すビジュアルフィードバックを提供できます。

nativeDragUpdate

ドラッグ元のインタラクティブオブジェクトでは、DragUpdate イベントを使用して、ジェスチャ中にオブジェクトの状態を更新できます(このイベントは Linux の AIR には存在しません)。

nativeDragEnter

ドロップ可能なインタラクティブオブジェクトでは、このイベントを使用して、フォーカスを受け取ったり、ドロップを受け入れ可能かどうかをビジュアルで示したりできます。

nativeDragOver

ドロップ可能なインタラクティブオブジェクトでは、このイベントを使用して、オブジェクト内でのマウスの動き(市街地図表示などの複雑なコンポーネントの「ホット」領域にマウスが移動した場合など)に対応できます。

nativeDragExit

ドロップ可能なインタラクティブオブジェクトでは、このイベントを使用して、ドラッグジェスチャが境界の外側に移動したときにオブジェクトの状態を復元できます。

nativeDragComplete

ドラッグ元のインタラクティブオブジェクトでは、このイベントを使用して、関連するデータモデルを更新し(リストからアイテムを削除するなど)、オブジェクトの外観を復元することができます。

ドラッグインジェスチャ中のマウス位置の追跡

ドラッグジェスチャがコンポーネント上にある間、そのコンポーネントによって nativeDragOver イベントが送出されます。このイベントは数ミリ秒ごとに送出されます。また、マウスの移動時にも送出されます。 nativeDragOver イベントオブジェクトを使用すると、コンポーネント上のマウスの位置を確認できます。これは、ドロップ先のコンポーネントがサブコンポーネントを含まない複雑なコンポーネントである場合に役立つことがあります。例えば、市街地図を含むビットマップを表示するアプリケーションで、ユーザーが地図上のゾーンに情報をドラッグしたときにそのゾーンを強調表示する場合は、 nativeDragOver イベントで報告されるマウス座標を使用してマップ内のマウス位置を追跡できます。