Flashにおけるマルチタッチ実装について
2009 年 8 月 8 日 土曜日iPhoneを色々触ってQuadCameraに、自力で回転つきUIScrollViewとかを実装したりしたお陰で、ようやっとFlashでマルチタッチを実装するノウハウとかが確立できた気がする。
Flashでマルチタッチはサイネージ系でもほぼ仕事がなさそうだけど、先行投資研究としてメモ。 数年後には需要がでるはず。
■マルチタッチを如何に管理するか
ゆび1つにつき1つのTouchObjectとして管理し、TOUCH_PRESS, TOUCH_RELESE, TOUCH_MOVE をEventDispacherで発行するようにする。 要はこのパートはiPhoneの機構をマルパクリする。
■タッチの同一性の検出
最大の問題は、指Aのタッチと指Bのタッチの同一性を検出すること。 つまりマルチタッチでグリグリ動かすときに、2つのタッチでどっちがAでBかを正しく判別しつづけること。 iPhoneではココはOSが担当してくれているのだけど、自力実装をしようとすると大半はここで挫折することとなる。
これについては基本的に、「前フレームの全てのTouch」と「今フレームの全てのTouch」の距離差を総当りし、「過去と現在の移動距離の差の総和」が最も小さくなる組み合わせを採用することで、かなりの精度でタッチの同一性を検出することができる。
しかし高速で指を移動させた場合、タッチの検出が間に合わない可能性や、交差した瞬間に指が入れ替わってしまう可能性が残る。これについては、サブパラメータとして、「既に検出されているタッチ」は移動速度を加重平均で測定し、速度が一定以上の場合は、現在位置のかわりに次フレームの予想到達地点を基準に、タッチ距離を計測することで、ある程度解決できる。
■ジェスチャーの認識
スワイプやダブルタップは自力実装できるが、文字や記号を認識する場合はどうすればいいのか? ここはiPhoneでもOSレベルでは提供されていないので、やっている人はほぼいない。 これについてはレーベンシュタイン距離によるジェスチャー間の類似度測定によって達成できる。 レーベンシュタイン距離に関する解説は、はてなおや先生とヤフー知恵袋がわかりやすい。
ちなみにレーベンシュタイン距離によるジェスチャー実装は、Flashでは過去事例が存在するので多分大丈夫だと思う。
