メニューの基本Flash Player 9 以降、Adobe AIR 1.0 以降 AIR アプリケーションでのネイティブメニューの作成に関する簡単な説明およびコード例については、Adobe Developer Connection で次のクイックスタート記事を参照してください。 ネイティブメニュークラスを使用すると、アプリケーションを実行しているオペレーティングシステムのネイティブメニュー機能にアクセスすることができます。NativeMenu オブジェクトは、アプリケーションメニュー(Mac OS X で使用可能)、ウィンドウメニュー(Windows および Linux で使用可能)、コンテキストメニューおよびポップアップメニューに使用できます。 AIR の外部で、コンテキストメニュークラスを使用することにより、アプリケーションでユーザーがオブジェクトを右クリックまたは Command キーを押しながらクリックしたときに Flash Player で自動的に表示するコンテキストメニューを変更できます(自動コンテキストメニューは AIR アプリケーションでは表示されません)。 メニューのタイプAIR では、次のタイプのメニューをサポートしています。
コンテキストメニューについてSWF コンテンツでは、InteractiveObject を継承するオブジェクトの contextMenu プロパティにメニューオブジェクトを割り当てることによって、そのオブジェクトにコンテキストメニューを含めることができます。「進む」、「戻る」、「印刷」、「品質」、「ズーム」などのいくつかのコマンドは、デフォルトで組み込まれています。AIR ランタイムでは、contextMenu に割り当てることができるメニューオブジェクトのタイプは、NativeMenu または ContextMenu です。Flash Player ランタイムでは、ContextMenu クラスだけを使用できます。 ContextMenu クラスと ContextMenuItem クラスを使用する場合、ネイティブメニューイベントまたはコンテキストメニューイベントをリッスンできます。両方のクラスが送出されます。ContextMenuEvent オブジェクトのプロパティの利点の 1 つは、contextMenuOwner はメニューが関連付けられているオブジェクトを識別し、mouseTarget はメニューを開くためにクリックされたオブジェクトを識別する点です。この情報は、NativeMenuEvent オブジェクトからは使用できません。 次の例では、Sprite を作成し、単純な編集コンテキストメニューを追加します。 var sprite:Sprite = new Sprite(); sprite.contextMenu = createContextMenu() private function createContextMenu():ContextMenu{ var editContextMenu:ContextMenu = new ContextMenu(); var cutItem:ContextMenuItem = new ContextMenuItem("Cut") cutItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCutCommand); editContextMenu.customItems.push(cutItem); var copyItem:ContextMenuItem = new ContextMenuItem("Copy") copyItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCopyCommand); editContextMenu.customItems.push(copyItem); var pasteItem:ContextMenuItem = new ContextMenuItem("Paste") pasteItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doPasteCommand); editContextMenu.customItems.push(pasteItem); return editContextMenu } private function doCutCommand(event:ContextMenuEvent):void{trace("cut");} private function doCopyCommand(event:ContextMenuEvent):void{trace("copy");} private function doPasteCommand(event:ContextMenuEvent):void{trace("paste");} 注意: ブラウザー環境で表示される SWF コンテンツとは異なり、AIR のコンテキストメニューにはビルトインコマンドはありません。
Flash Player コンテキストメニューのカスタマイズブラウザーまたはプロジェクターでは、SWF コンテンツのコンテキストメニューに常にビルトインアイテムが含まれます。「設定」および「Flash Player について」コマンド以外のデフォルトのコマンドは、すべてメニューから削除できます。 そうするには、Stage プロパティ showDefaultContextMenu を false に設定します。 特定の表示オブジェクトに対してカスタマイズしたコンテキストメニューを作成する場合、ContextMenu クラスの新しいインスタンスを作成して hideBuiltInItems() メソッドを呼び出し、そのインスタンスを該当の DisplayObject インスタンスの contextMenu プロパティに割り当てます。次の例では、動的に描画される四角形に、色をランダムに変更するコンテキストメニューコマンドを設定します。 var square:Sprite = new Sprite(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0,0,100,100); square.graphics.endFill(); square.x = square.y = 10; addChild(square); var menuItem:ContextMenuItem = new ContextMenuItem("Change Color"); menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,changeColor); var customContextMenu:ContextMenu = new ContextMenu(); customContextMenu.hideBuiltInItems(); customContextMenu.customItems.push(menuItem); square.contextMenu = customContextMenu; function changeColor(event:ContextMenuEvent):void { square.transform.colorTransform = getRandomColor(); } function getRandomColor():ColorTransform { return new ColorTransform(Math.random(), Math.random(), Math.random(),1,(Math.random() * 512) - 255, (Math.random() * 512) -255, (Math.random() * 512) - 255, 0); } ネイティブメニューの構造(AIR)ネイティブメニューは、性質として階層的な構造をしています。NativeMenu オブジェクトには、子の NativeMenuItem オブジェクトが含まれます。さらに、サブメニューを表す NativeMenuItem オブジェクトに NativeMenu オブジェクトを含めることができます。構造内の最上位レベル、つまりルートレベルのメニューオブジェクトは、アプリケーションメニューおよびウィンドウメニューのメニューバーを表します(コンテキスト、アイコンおよびポップアップの各メニューにはメニューバーはありません)。 次の図に、典型的なメニューの構造を示します。ルートメニューはメニューバーを表しており、File サブメニューおよび Edit サブメニューを参照する 2 つのメニューアイテムが含まれています。この構造の File サブメニューには、2 つのコマンドアイテムと、Open Recent Menu サブメニュー(このサブメニュー自体にも 3 つのアイテムが含まれています)を参照するアイテムが含まれています。Edit サブメニューには、3 つのコマンドと 1 つのセパレーターが含まれています。 サブメニューを定義するには、NativeMenu オブジェクトと NativeMenuItem オブジェクトの両方が必要です。NativeMenuItem オブジェクトでは親メニューに表示されるラベルが定義され、ユーザーはこのオブジェクトを使用してサブメニューを開くことができます。NativeMenu オブジェクトは、サブメニューのアイテムのコンテナとして機能します。NativeMenuItem オブジェクトでは、NativeMenuItem の submenu プロパティを通して NativeMenu オブジェクトを参照します。 このメニューを作成するコードの例については、ネイティブメニューの例:ウィンドウメニューとアプリケーションメニュー(AIR)を参照してください。 メニューイベントNativeMenu オブジェクトと NativeMenuItem オブジェクトは、どちらも preparing イベント、displaying イベント、select イベントを送出します。 preparing:オブジェクトがユーザー操作を開始する直前に、登録されているすべてのリスナーに対して、メニューおよびそのメニューアイテムから preparin イベントが送出されます。操作には、メニューを開く操作やキーボードショートカットによるアイテムの選択などが含まれます。
注意: preparing イベントは、Adobe AIR 2.6 以降のみで利用できます。
ネイティブメニューコマンドと等価なキー(AIR)メニューコマンドにキーボードショートカット(アクセラレーター)を割り当てることができます。キーまたはキーの組み合わせが押されると、メニューアイテムから、登録されているすべてのリスナーに select イベントが送出されます。アイテムが格納されるメニューは、コマンドが呼び出されるアプリケーションまたはアクティブなウィンドウのメニューの一部である必要があります。 キーボードショートカットは 2 つの部分から構成されます。主キーを表すストリングと、一緒に押される必要がある修飾キーの配列です。主キーを割り当てるには、メニューアイテムの keyEquivalent プロパティに、そのキーの 1 文字のストリングを設定します。大文字を使用した場合、修飾キーの配列に Shift キーが自動的に追加されます。 Mac OS X では、デフォルトの修飾キーは Command キー(Keyboard.COMMAND)です。Windows および Linux では、Ctrl キー(Keyboard.CONTROL)です。これらのデフォルトのキーは、修飾キーの配列に自動的に追加されます。別の修飾キーを割り当てるには、そのキーコードを含む新しい配列を keyEquivalentModifiers プロパティに割り当てます。デフォルトの配列は上書きされます。デフォルトの修飾キーを使用するか独自の修飾キーの配列を割り当てるかに関係なく、keyEquivalent プロパティに割り当てたストリングが大文字の場合は Shift キーが追加されます。修飾キーに使用するキーコードの定数は、Keyboard クラスで定義されています。 割り当てられたキーボードショートカットのストリングは、自動的にメニューアイテム名の横に表示されます。形式は、ユーザーのオペレーティングシステムおよびシステムの環境設定によって異なります。 注意: Windows オペレーティングシステムでキー修飾の配列に Keyboard.COMMAND 値を割り当てた場合、メニューにキーボードショートカットは表示されません。ただし、そのメニューコマンドをアクティブにするには Ctrl キーを使用する必要があります。
次の例では、メニューアイテムのキーボードショートカットとして Ctrl+Shift+G を割り当てます。 var item:NativeMenuItem = new NativeMenuItem("Ungroup"); item.keyEquivalent = "G"; 次の例では、修飾キーの配列を直接設定することにより、キーボードショートカットとして Ctrl+Shift+G を割り当てます。 var item:NativeMenuItem = new NativeMenuItem("Ungroup"); item.keyEquivalent = "G"; item.keyEquivalentModifiers = [Keyboard.CONTROL]; 注意: キーボードショートカットでトリガーできるのは、アプリケーションメニューまたはウィンドウメニューのみです。コンテキストメニューまたはポップアップメニューにキーボードショートカットを追加した場合、メニューラベルにはキーボードショートカットが表示されますが、関連付けられたメニューコマンドを呼び出すことはできません。
ニーモニック(AIR)ニーモニックは、オペレーティングシステムのメニューのキーボードインターフェイスの一部です。Linux、Mac OS X および Windows では、いずれもキーボードでメニューを開いてコマンドを選択する操作ができますが、その方法には微妙な違いがあります。 Mac OS X では、ユーザーはメニューまたはコマンドの最初の 1 文字か 2 文字を入力して、Return キーを押します。mnemonicIndex プロパティは無視されます。 Windows では、これを 1 文字だけで実行できます。デフォルトでは、有効な文字はラベルの最初の文字ですが、メニューアイテムにニーモニックを割り当てると、有効な文字は指定した文字になります。メニュー内の 2 つのアイテムの有効な文字が同じ場合(ニーモニックが割り当てられているかどうかに関係なく)、メニューのキーボード操作が少し異なります。1 文字入力してメニューまたはコマンドを選択するのではなく、ユーザーは必要な回数だけその文字を入力して対象のアイテムを強調表示してから、Enter キーを押して選択を完了する必要があります。動作の一貫性を維持するために、ウィンドウメニューでは、メニュー内のアイテムそれぞれに異なるニーモニックを割り当てることをお勧めします。 Linux では、既定のニーモニックは設定されません。メニューアイテムの mnemonicIndex プロパティ値を設定することでニーモニックを指定する必要があります。 ニーモニック文字は、ラベルストリングのインデックスとして指定します。ラベルの最初の文字のインデックスは 0 です。したがって、「Format」というラベルのメニューアイテムのニーモニックとして「r」を使用するには、mnemonicIndex プロパティを 2 に設定します。 var item:NativeMenuItem = new NativeMenuItem("Format"); item.mnemonicIndex = 2; メニューアイテムの状態メニューアイテムには、状態を表すプロパティとして、checked および enabled という 2 つのプロパティがあります。
メニューアイテムへのオブジェクトの関連付けNativeMenuItem クラスの data プロパティを使用して、各アイテムの任意のオブジェクトを参照できます。例えば、最近使用したファイルを開くメニューでは、それぞれのメニューアイテムに各ドキュメントの File オブジェクトを割り当てることができます。 var file:File = File.applicationStorageDirectory.resolvePath("GreatGatsby.pdf") var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name)); menuItem.data = file; |
![]() |