Windows タッチ&ジェスチャ研究室 Vol.04 ~Windows Phoneのタッチ#2~

2011年4月15日に、Windows Phone 7 アプリケーション開発 Deep Diveというセミナーを開催しました。
そのセミナーのタッチ&ジェスチャーのセッションをもとに説明します。
今回は、そのセッションをもとにした記事の第2回目です。
使用したスライドは、セミナーのWebサイトからダウンロードできます。

前回の記事 : Windows Phoneのタッチ#1

Windows Phoneでタッチやジェスチャに対応する場合、大きく4つの方法があります。
1つは前回説明したScrollViewerコントロールを使う方法です。
今回は難易度1のマウスイベントを使う方法と、難易度2のマニピュレーションを使う方法を紹介します。


マウスイベントを使う方法は、従来のWindows用のアプリケーションを作る時の方法と同じです。
タップした時になにかさせたいコントロールのマウスイベントを使うだけです。
Windows Phoneにはマウスはありませんが、Windows Phoneに搭載されているSilverlightにはマウス関係のイベントがあり、タップをマウス関連のイベントに変換してくれます。
例えば画面をタップした時に何かさせたいときは、MouseLeftButtonUpイベントに対応するイベントハンドラーを作成し、その中にプログラムを記述します。
ただ、この方法は2つの指を使うジェスチャーを検知できません。
2つの指を使うときは、マニピュレーション(Manipulation)を使います。


マニピュレーションには、2つのふるまいがあります。
1つは、1本指でさわっているときのふるまいです。もう1つは、2本指でさわっているときのふるまいです。
1本指と2本指で、取得できる情報に差があります。これについては後ほど説明します。

画面をさわったときにManipulationStartedというイベントが発生します。このイベントで、さわった位置を取得できます。
さわったまま指を動かすと、ManipulationDeltaというイベントが発生します。指の移動に伴い、画面の描画をおこなうときはこのイベントを使用します。
そして指を画面から離すと、ManipurationCompletedというイベントが発生します。


1本指でタッチしているときはパンとみなし、Transrationという情報を取得できます。
2本指でタッチしているときはピンチまたはストレッチとみなし、Scaleという情報を取得できます。
1本指でタッチしているときはScaleの情報はなく、2本指でタッチしているときにはTranslationの情報はありません。

以下のソースコードは、マニピュレーションのテスト用のプログラムです。
画面にテキストブロックを10個貼り付け、PhoneApplicationPageのManipulationStarted、ManipulatiponDelta、ManipulationCompletedイベントに対応したイベントハンドラーにそれぞれ以下のコードを追加します。

private void PhoneApplicationPage_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
  textBlock1.Text = "StartX = " + e.ManipulationOrigin.X;
  textBlock2.Text = "SrartY = " + e.ManipulationOrigin.Y;
}

private void PhoneApplicationPage_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
  textBlock3.Text = "ScaleX = " + e.DeltaManipulation.Scale.X.ToString();
  textBlock4.Text = "ScaleY = " + e.DeltaManipulation.Scale.Y.ToString();
  textBlock5.Text = "TransX = " + e.DeltaManipulation.Translation.X.ToString();
  textBlock6.Text = "TransY = " + e.DeltaManipulation.Translation.Y.ToString();
}

private void PhoneApplicationPage_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
  textBlock7.Text = "TotalTransX = " + e.TotalManipulation.Translation.X;
  textBlock8.Text = "TotalTransY = " + e.TotalManipulation.Translation.Y;
  textBlock9.Text = "TotalScaleX = " + e.TotalManipulation.Scale.X;
  textBlock10.Text = "TotalScaleY = " + e.TotalManipulation.Scale.Y;
}

実行すると、TranslationやScaleにどのような値が入るかをテストできます。
なお、ManipulationはWindows PhoneのSilverlightにのみ搭載されている機能で、PC版のSilverlightでは使うことができません。

マイクロソフト
田中達彦