タッチイベント処理

Flash Player 10.1 以降、Adobe AIR 2 以降

ActionScript では、他のイベント(マウスイベントなど)と同じ方法で、基本タッチイベントを処理します。 TouchEvent クラス のイベントタイプ定数によって定義された一連のタッチイベントを監視できます。
注意: 複数のタッチポイント入力(2 本以上の指でデバイスにタッチするなど)の場合、最初のタッチしたときにマウスイベントとタッチイベントが送出されます。
基本タッチイベントを処理するには:
  1. アプリケーションでタッチイベントを処理するように設定するには、 flash.ui.Multitouch.inputMode プロパティを MultitouchInputMode.TOUCH_POINT に設定します。

  2. InteractiveObject クラスからプロパティを継承しているクラス(Sprite や TextField など)のインスタンスに、イベントリスナーをアタッチします。

  3. 処理対象のタッチイベントのタイプを指定します。

  4. イベントに応答して処理を行うには、イベントハンドラー関数を呼び出します。

例えば、次のコードは、タッチスクリーン上で mySprite に描画された四角形をタップしたときにメッセージを表示します。

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
 
var mySprite:Sprite = new Sprite(); 
var myTextField:TextField = new TextField(); 
 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
 
mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
    myTextField.text = "I've been tapped"; 
    myTextField.y = 50; 
    addChild(myTextField); 
}

タッチイベントのプロパティ

イベントが発生すると、イベントオブジェクトが作成されます。TouchEvent オブジェクトには、タッチイベントの位置及び状態に関する情報が含まれています。この情報を取得するには、イベントオブジェクトのプロパティを使用します。

例えば、次のコードは、 evt という TouchEvent オブジェクトを作成してから、テキストフィールドにイベントオブジェクトの stageX プロパティ(ステージ領域でタッチが発生した位置の x 座標)を表示します。

Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT; 
 
var mySprite:Sprite = new Sprite(); 
var myTextField:TextField = new TextField(); 
 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
 
mySprite.addEventListener(TouchEvent.TOUCH_TAP, taphandler); 
 
function taphandler(evt:TouchEvent): void { 
myTextField.text = evt.stageX.toString; 
myTextField.y = 50; 
addChild(myTextField); 
}
イベントオブジェクト全体で使用可能なプロパティについては、 TouchEvent クラスを参照してください。
注意: すべての TouchEvent プロパティがすべてのランタイム環境でサポートされているわけではありません。例えば、一部のタッチ対応デバイスは、ユーザーがタッチスクリーンに加えている接触圧の大きさを検出できません。このようなデバイスでは、 TouchEvent.pressure プロパティはサポートされません。アプリケーションが動作することを保証するには、特定のプロパティのサポートを確認します。詳しくは、 トラブルシューティング を参照してください。

タッチイベントのフェーズ

マウスイベントの場合と同様に、InteractiveObject 上およびその外部で、様々なステージにまたがってタッチイベントを追跡します。また、タッチ操作の開始、経過、終了を通してタッチイベントを追跡します。TouchEvent クラスは touchBegin touchMove および touchEnd の各イベントを処理するための値を提供します。

例えば、ユーザーが表示オブジェクトをタッチまたは移動したときに、 touchBegin touchMove および touchEnd の各イベントを使用して、ユーザーにビジュアルフィードバックを提供できます。

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
myTextField.width = 200; 
myTextField.height = 20; 
addChild(myTextField); 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
function onTouchBegin(event:TouchEvent) { 
    myTextField.text = "touch begin" + event.touchPointID; 
} 
function onTouchMove(event:TouchEvent) { 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    myTextField.text = "touch end" + event.touchPointID; 
}
注意: mySprite には開始タッチイベントのリスナーはアタッチされていますが、移動または編集のタッチイベントに対するリスナーはアタッチされていません。ユーザーの指またはポインティングデバイスが表示オブジェクトの前面に移動すると、ステージが継続的にタッチイベントを監視します。

タッチポイント ID

TouchEvent.touchPointID プロパティは、タッチ入力に応答するアプリケーションを記述する上で重要です。Flash ランタイムは、タッチポイントごとに一意の touchPointID 値を割り当てます。アプリケーションは、タッチ入力のフェーズまたは動きに応答する時は必ず、イベントを処理する前に touchPointID を確認します。Sprite クラスのタッチ入力のドラッグメソッドでは、適切な入力インスタンスを処理するために touchPointID プロパティをパラメーターとして使用します。 touchPointID プロパティは、イベントハンドラーが適切なタッチポイントに応答していることを保証します。このプロパティがなければ、イベントハンドラーは、デバイス上におけるタッチイベントタイプの不特定のインスタンス(例えば、すべての touchMove イベント)に応答するので、予期せぬ動きが発生します。このプロパティはオブジェクトをドラッグする場合に特に重要です。

タッチシーケンス全体を管理するには、 touchPointID プロパティを使用します。タッチシーケンスには touchBegin イベント(1 つ)、 touchMove イベント(必要に応じて)および touchEnd イベント(1 つ)が含まれ、すべて同じ touchPointID 値を保持しています。

次の例は、変数 touchMoveID を確立し、touchMove イベントに応答する前に、 touchPointID の値が正しいことを確認します。この値が正しくないと、他のタッチ入力によってもイベントハンドラーがトリガーされます。移動段階と終了段階のリスナーはステージ上にあります。表示オブジェクト上にはありません。ユーザーはタッチポイントを表示オブジェクトの境界外に移動する可能性があるので、移動フェーズと終了フェーズはステージによって監視されます。
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
var mySprite:Sprite = new Sprite(); 
mySprite.graphics.beginFill(0x336699); 
mySprite.graphics.drawRect(0,0,40,40); 
addChild(mySprite); 
var myTextField:TextField = new TextField(); 
addChild(myTextField); 
myTextField.width = 200; 
myTextField.height = 20; 
var touchMoveID:int = 0; 
 
mySprite.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); 
function onTouchBegin(event:TouchEvent) { 
    if(touchMoveID != 0) { 
        myTextField.text = "already moving. ignoring new touch";     
        return; 
    } 
    touchMoveID = event.touchPointID; 
 
    myTextField.text = "touch begin" + event.touchPointID; 
    stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
} 
function onTouchMove(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch"; 
        return; 
    } 
    mySprite.x = event.stageX; 
    mySprite.y = event.stageY; 
    myTextField.text = "touch move" + event.touchPointID; 
} 
function onTouchEnd(event:TouchEvent) { 
    if(event.touchPointID != touchMoveID) { 
        myTextField.text = "ignoring unrelated touch end"; 
        return; 
    } 
    touchMoveID = 0; 
    stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); 
    stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); 
    myTextField.text = "touch end" + event.touchPointID; 
}