AIR でも、マルチタッチイベントを取得できるクラスが追加されています。
なので簡単に実装できると思っていたら、意外な落とし穴が…。
マルチタッチのイベントを扱うクラスは TouchEvent クラスです。
リファレンスを見ると、今まで使用していた MouseEvent クラスを TouchEvent クラスに置き換えるだけでなんとかなりそうです。
んが、この TouchEvent クラスが、Macに対応していないようなのです!!
コードを記述することはできますが、イベントを受け取ることができないのです。デバッグに不便です。
マウスではクリックイベントが同時に起きるという事はないので、Macが TouchEvent クラスに対応していないのも、当たり前なのでしょうか?
マウスクリックもマルチタッチの1回目のタッチと同じとして、TouchEvent クラスでハンドリングできても良かったのではないかと思います。
しかし、Adobeオフィシャル的には、MouseEvent 、TouchEvent を併用するのが、正しい作法であるみたいです。以下は、base_mcというSprite上のマウスイベントと、タッチイベントを受け取るコードです。
var base_mc:Sprite = new Sprite(); base_mc.addEventListener(MouseEvent.MOUSE_DOWN,baseMouseDown); base_mc.addEventListener(TouchEvent.TOUCH_BEGIN,baseMultiTouchBegin); addChild(base_mc); // base_mcマウスダウンイベント function baseMouseDown(e:MouseEvent):void { trace(e.stageX.toString()+","+e.stageY.toString()); } // base_mcのマルチタッチイベント function baseMultiTouchBegin(e:TouchEvent):void { if (!e.isPrimaryTouchPoint) { trace(e.stageX.toString()+","+e.stageY.toString()); } }
上記を実行すると、Mac上では、baseMouseDown()関数しか呼ばれません。
iOS上では、baseMouseDown()、baseMultiTouchBegin()の両関数が呼ばれます。
しかし、複数同時タッチした場合に、1つ目のタッチイベントが baseMouseDown()、baseMultiTouchBegin()の両方にやってくることになります。なので、一方をスキップしてやらなければいけません。
TouchEvent.isPrimaryTouchPointプロパティは、このイベントが MouseEvent にマップされているかどうかを表すBoolean値です。これが true であれば MouseEventでマップされているよ、という意味になります。なんて都合の良いプロパティでしょう(笑)
この isPrimaryTouchPoint プロパティこそが、僕が先に「Adobeオフィシャル的」と言った意味なのでした。
何はともあれ、ネコグラス時計でもマルチタッチに対応することができました。タッチした時のエフェクトが重い関係で、2つ同時までしかマルチタッチを許しておりませんが。(笑)
でも、だいぶ良い感じになりました。
0 件のコメント:
コメントを投稿