モバイルアプリケーションでのユーザー入力の処理

モバイルアプリケーションでは、デスクトップやブラウザーアプリケーションとは異なるユーザー入力の処理が必要になります。 AIR 用に構築されたデスクトップアプリケーション、または Flash Player 用に構築されたブラウザーアプリケーションでは、主要な入力デバイスはマウスおよびキーボードです。モバイルデバイスの場合、主要な入力デバイスはタッチスクリーンです。モバイルデバイスは何らかのキーボードを備えている場合も多く、デバイスによっては 5 方向(左、右、上、下、選択)の入力方法も備えています。

mx.core.UIComponent クラスは、アプリケーションで使用する入力タイプをコンポーネントで設定するのに使用する interactionMode スタイルプロパティを定義します。Halo と Spark テーマの場合、デフォルト値は mouse で、マウスが主要な入力デバイスであることを示しています。Mobile テーマの場合、デフォルト値は touch で、主要な入力デバイスがタッチスクリーンであることを示しています。

モバイルアプリケーションでのハードウェアキーのサポート

ViewNavigatorApplication コンテナまたは TabbedViewNavigatorApplication コンテナで定義されているアプリケーションは、デバイスの戻るハードウェアキーとメニューハードウェアキーに応答します。戻るキーを押すと、アプリケーションは前のビューにナビゲートします。前のビューがない場合は、アプリケーションが終了し、デバイスのホームスクリーンが表示されます。

戻るボタンを押すと、アプリケーションのアクティブビューが backKeyPressed イベントを受信します。 戻るキーのアクションをキャンセルするには、backKeyPressed イベントのイベントハンドラーで preventDefault() を呼び出します。

メニューボタンを押すと、現在のビューに ViewMenu コンテナが定義されている場合は、そのコンテナが表示されます。 ViewMenu コンテナは、View コンテナの下部にあるメニューを定義します。各 View コンテナは、そのビュー固有のメニューを定義します。

メニューキーを押すと、現在の View コンテナが menuKeyPressed イベントを送出します。メニューボタンのアクションをキャンセルして、ViewMenu が表示されないようにするには、menuKeyPressed イベントのイベントハンドラーの preventDefault() メソッドを呼び出します。

詳しくは、モバイルアプリケーションでのメニューの定義を参照してください。

モバイルアプリケーションでのハードウェアキーボードイベントの処理

Flex で構築したモバイルアプリケーションでは、ユーザーによってモバイルデバイスのハードウェアキーが押されたことを検出できます。例えば、Android デバイスで、ホームボタン、戻るボタンまたはメニューボタンが押されたことを検出できます。

ハードウェアキーが押されたことを検出するには、KEY_UP または KEY_DOWN イベントのイベントハンドラーを作成します。通常、イベントハンドラーは、Application、ViewNavigatorApplication または TabbedViewNavigatorApplication コンテナで定義されているアプリケーションオブジェクトに追加します。

Stage オブジェクトでは、アプリケーションの描画領域を定義します。各アプリケーションには、Stage オブジェクトが 1 つあります。したがって、アプリケーションコンテナは、実際には Stage オブジェクトの子コンテナになります。

Stage.focus プロパティは、現在キーボードフォーカスが設定されているコンポーネントを示します。どのコンポーネントにもフォーカスが設定されていない場合は null になります。キーボードフォーカスが設定されているコンポーネントとは、ユーザーがキーボードを操作したときに、イベントの通知を受け取るコンポーネントです。そのため、Stage.focus がアプリケーションオブジェクトに設定されている場合は、アプリケーションオブジェクトのイベントハンドラーが呼び出されます。

モバイルデバイスでは、別のアプリケーションによってアプリケーションが中断されることがあります。例えば、モバイルデバイスでアプリケーションを実行しているときに電話がかかってきたり、ユーザーによって別のアプリケーションに切り替えられたりすることがあります。ユーザーがアプリケーションの切り替えを戻したときには、Stage.focus プロパティに null が設定されます。そのため、アプリケーションオブジェクトに割り当てられたイベントハンドラーは、キーボードに反応しません。

モバイルアプリケーションでは Stage.focus プロパティが null になる可能性があるので、Stage オブジェクト自体でキーボードイベントをリスニングして、必ずアプリケーションでイベントが認識されるようにしてください。次の例は、キーボードイベントハンドラーを Stage オブジェクトに割り当てています。

<?xml version="1.0" encoding="utf-8"?>
<!-- containers\mobile\SparkHWEventHandler.mxml -->
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark" 
    firstView="views.SparkHWEventhandlerHomeView"
    applicationComplete="appCompleteHandler(event);">
    
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            
            // Add the hardware key event handlers to the stage.
            protected function appCompleteHandler(event:FlexEvent):void {
                stage.addEventListener("keyDown", handleButtons, false,1);
                stage.addEventListener("keyUp", handleButtons, false, 1);
            }
            
            // Event handler to handle hardware keyboard keys.
            protected function handleButtons(event:KeyboardEvent):void
            {
                if (event.keyCode == Keyboard.HOME) {
                    // Handle Home button.
                }
                else if (event.keyCode == Keyboard.BACK) {
                    // Hanlde back button.
                }
            }
        ]]>
    </fx:Script>
</s:ViewNavigatorApplication>

モバイルアプリケーションでのマウスイベントとタッチイベントの処理

AIR では、異なる入力タイプを示すために異なるイベントを生成します。これには次のようなイベントが含まれます。

マウスイベント
マウスまたはタッチスクリーンによって生成されたユーザーインタラクションによって生成されたイベント。マウスイベントには、mouseOvermouseDown および mouseUp があります。

タッチイベント
タッチスクリーンへの指でのタッチなど、ユーザーによるデバイスへの接触を検出するデバイスで生成されるイベント。タッチイベントには、touchTaptouchOver および touchMove があります。ユーザーがタッチスクリーンでデバイスを操作する場合は、通常、指またはポインティングデバイスを使用してスクリーンにタッチします。

ジェスチャーイベント
2 本の指でタッチスクリーンを同時に押すなど、マルチタッチインタラクションで生成されるイベント。ジェスチャーイベントには、gesturePangestureRotate および gestureZoom があります。例えば、一部のデバイスでは、ピンチジェスチャーを使用してイメージをズームアウトできます。

マウスイベントのプリセットサポート

Flex フレームワークおよび Flex コンポーネントセットには、マウスイベントのプリセットのサポートはありますが、タッチイベントやジェスチャーイベントのサポートはありません。例えば、ユーザーはタッチスクリーンを使用して、モバイルアプリケーションの Flex コンポーネントを操作します。コンポーネントは、mouseDownmouseOver などのマウスイベントに応答しますが、タッチイベントやジェスチャーイベントには応答しません。

例えば、ユーザーがタッチスクリーンを押して Flex の Button コントロールを選択したとします。Button コントロールは、mouseUp および mouseDown イベントを使用して、ユーザーがこのコントロールを操作したことを通知します。Scroller コントロールは、mouseMove および mouseUp イベントを使用して、ユーザーが表示をスクロールしていることを示します。

AIR によって生成されたイベントの制御

flash.ui.Multitouch.inputMode プロパティは、AIR および Flash Player で生成されるイベントを制御します。flash.ui.Multitouch.inputMode プロパティの値は、次のうちのいずれかです。
  • MultitouchInputMode.NONE:AIR ではマウスイベントを送出しますが、タッチイベントまたはジェスチャーイベントは送出しません。

  • MultitouchInputMode.TOUCH_POINT:AIR ではマウスイベントおよびタッチイベントを送出しますが、ジェスチャーイベントは送出しません。このモードでは、Flex フレームワークは、MultitouchInputMode.NONE で受信するのと同じマウスイベントを受信します。

  • MultitouchInputMode.GESTURE:AIR ではマウスイベントおよびジェスチャーイベントを送出しますが、タッチイベントは送出しません。このモードでは、Flex フレームワークは、MultitouchInputMode.NONE で受信するのと同じマウスイベントを受信します。

リストに示すように、flash.ui.Multitouch.inputMode プロパティの設定に関係なく、AIR は常にマウスイベントを送出します。 したがって、Flex コンポーネントは、タッチスクリーンを使用して実行されたユーザーインタラクションに常に応答できます。

Flex では、アプリケーションの flash.ui.Multitouch.inputMode プロパティにどの値でも使用できます。したがって、Flex コンポーネントは、タッチイベントおよびジェスチャーイベントに応答しませんが、どのイベントにも応答するようにアプリケーションに機能を追加できます。例えば、Button コントロールにイベントハンドラーを追加して、touchTaptouchOvertouchMove イベントなどのタッチイベントを処理できます。

『ActionScript 3.0 開発ガイド』には、様々なデバイスでのユーザー入力処理の概要と、タッチ、マルチタッチおよびジェスチャー入力操作に関する説明があります。詳しくは、以下を参照してください。