Windows タッチ&ジェスチャ研究室 Vol.01 ~Silverlightのマルチタッチ検出~

Windows 7は、マルチタッチをサポートしているOSです。
ここ数か月で、タッチをサポートしたPCが各社から発売され、タッチやジェスチャに対応したアプリケーションのニーズが高まってきています。
この連載では、Windowsのタッチやジェスチャを使うためのテクニカルな情報をお伝えします。
今までの連載は、長い文章を数回に分けて連載することにより、続きものとして掲載していました。
本連載は続き物ではなく、毎回何かしらのトピックに沿って情報を提供していきます。

一言にタッチ&ジェスチャと言っても、開発時にどのプラットフォームを使っているかによって、実装方法が異なります。
例えば、WPFはタッチやジェスチャに対応していますが、Silverlightでは純粋なタッチの情報しか取得できません。
連載は、どのプラットフォームを使用したかを明記し、それに対応したソースコード等を紹介します。

今回は、Silverlightのマルチタッチについて紹介します。
Silverlightでマルチタッチを検出するときには、Touchクラスというクラスを使用します。
このTouchクラスにはFrameReportedというイベントがあり、タッチを検出するたびにFrameReportedイベントが発生します。

FrameReportedのイベントハンドラーを作成するには、MainPage()の中のInitializeComponent()を呼び足した後に、以下のプログラムを記述して、[tab]キーを2回押します。
Touch.FrameReported +=

すると、以下のようにイベントハンドラーを登録する部分と、イベントハンドラーそのものが自動的に作成されます。
Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);

以下のソースコードは、FrameReportedイベントハンドラーの記述例です。
この例では、listBox1という名前のListBoxコントロールを1つ貼り付けていることが前提です。

void Touch_FrameReported(object sender, TouchFrameEventArgs e)
{
TouchPointCollection touchPoints = e.GetTouchPoints(null);

foreach (var touchPoint in touchPoints)
{
string str = String.Format(
"ID = {0}, Action = {1}, X = {2:##}, Y = {3:##}",
touchPoint.TouchDevice.Id, touchPoint.Action.ToString(),
touchPoint.Position.X, touchPoint.Position.Y);

listBox1.Items.Insert(0,str);
}
listBox1.Items.Insert(0, "===========");
}

このプログラムを実行すると、タッチするたびにその情報がリストボックスに追加されます。
touchPointsには、タッチされた情報が入ります。
シングルタッチの場合にはこの中に1つの情報しか入っていませんが、マルチタッチをしたときは、この中にタッチのポイント数分の情報が入ってきます。4点タッチしていれば、4点分の情報が含まれます。
foreach文を使用し、含まれているタッチポイント数分の情報を解析します。
ここでは、TouchDevice.Id、Action、Positionという情報を文字列に書き込んでいます。
TouchDevice.Idは、タッチしたときに自動的に割り振られる一意のIDです。
例えば人差し指でタッチしたときは、その人差し指を離すまで、人差し指によってもたらされる情報を1つのIDで管理します。
人差し指でタッチしている間に中指で別の場所をタッチすると、人差し指に割り振られたIDとは別のIDが中指のタッチに割り振られます。
タッチの状態であるActionには、Down、Move、Upという情報が入ります。
一つの指で画面を触るとDown、動かすとMove、離すとUpという情報が伝えられるのです。DownからUpまでは、同じIDが使われます。

このテストプログラムは、Windows Phone 7でも全く同じソースコードを同じ手順で使用できます。
Silverlight大全の第6章にあるマルチタッチの部分でも、同じソースコードを使用して説明しています。

マイクロソフト
田中達彦