GestureEvent に phase という属性があります。ここには、ジェスチャーのフェーズ (例えば、新しいジェスチャーが開始された、さっきのジェスチャーの続きである、等) の情報が設定されます。
設定可能な値は GesturePhase クラスに定義されていて、下の 4 つがあります。
- ALL : String [static]
- BEGIN : String [static]
- UPDATE : String [static]
- END : String [static]
一番上の ALL は、色々な段階を持たない単純なジェスチャーによるイベントに使われます。
具体的には、GESTURE_TWO_FINGER_TAP と GESTURE_SWIPE の 2 つのイベントが、phase 属性は常に ALL になります。どちらのジェスチャーも、タップする、素早く移動する、と 1 つの動作だけで終わるジェスチャーなので、細かいフェーズを管理する必要が無い、という理解でよいかと思います。
addEventListener(TransformGestureEvent.GESTURE_SWIPE, onSwipe); function onSwipe(e:TransformGestureEvent):void { trace(e.phase); // ALL が出力される }
その他の 4 つのジェスチャーについては、BEGIN、UPDATE、END が状況に応じて設定されます。
新しいジェスチャーの開始時には BEGIN、既に始まったジェスチャーの続きの場合は UPDATE、そしてジェスチャーが終了した際のイベントには END が設定されます。この情報を利用することより、オブジェクトを拡大後に回転させるといったより複雑な操作にも対応できるようになります。
下のサンプルは、phase 属性の値を使い、GESTURE_PAN が始まったら対象のオブジェクトを視覚的に変化させ、終了したら元に戻す、というものです。
Multitouch.inputMode = MultitouchInputMode.GESTURE; var mySprite = new Sprite(); mySprite.graphics.beginFill(0xFF6600); mySprite.graphics.drawRect(0, 0, 200, 200); addChild(mySprite); mySprite.addEventListener(TransformGestureEvent.GESTURE_PAN, onPan); function onPan(e:TransformGestureEvent):void { var myTarget:Sprite = e.target as Sprite; // ターゲットを移動 myTarget.x += e.offsetX; myTarget.y += e.offsetY; if (e.phase == GesturePhase.BEGIN) { // PANジェスチャーの開始。スプライトを半透明に myTargett.alpha = 0.5; } else if (e.phase == GesturePhase.UPDATE) { // とりあえず何もしない } else if (e.phase == GesturePhase.END) { // PANジェスチャーの終了。スプライトを元に戻す myTargett.alpha = 1; } }
このように、同じ GESTURE_PAN イベントに対しても、フェーズごとに異なる処理を行うことが可能です。
コメントする