タッチイベントを取得する


WindowsPhone 7アプリケーション作成にあたって、ディスプレイをタッチした場所を知ることで様々なことができます。
例えば、お絵かきソフトの線を指のドラッグによって行ったりなどが可能になります。
そこで今回はWP7のタッチイベントのTouchを紹介します。

WP7でのタッチイベントはTouchというクラスを用います。
Touchでは、ディスプレイ操作を行うと、FrameReportedというイベントが発生します。
FrameReportedイベントは、登録したメソッドがコールバックされます。

Touchを用いるには下記の流れで処理を行います。

  1. タッチイベントの登録
  2. タッチの種類によっての処理変更

今回の最後にタッチの座標取得とタッチの種類を表示するサンプルを用意しました。

詳しい内容は続きを御覧ください。

タッチイベントの登録

タッチイベントを登録にはTouchのFrameReportedでタッチイベントが発生した際にコールバックされるメソッドを指定します。
TouchFrameReportedというメソッドをコールバックで呼び出せるようにしたい場合は下記のように記述します。

Touch.FrameReported += new TouchFrameEventHandler(TouchFrameReported);

これでFrameReported イベントが発生するとTouchFrameReportedというメソッドを呼び出されるようになります。

タッチの種類によっての処理変更

FrameReportedのタッチイベントによってコールバックされたメソッドではイベントデータのクラスTouchFrameEventArgsが得られます。
そのイベントデータからタッチの種類と座標を取得することができるTouchPointクラスを得ることができます。

TouchFrameEventArgsの主要なメソッドは下記のようになります。

メソッド名概要
TouchPoint GetPrimaryTouchPoint
(IInputElement relativeTo)
指定された要素に対する相対的な現在のタッチ点を返します。
nullを設定した場合はディスプレイの左上がを原点とした座標が得られる

GetPrimaryTouchPointによって得られるTouchPointの主要なプロパティは下記のようになります。

主要なプロパティ概要
TouchAction Actionタッチイベントの最後のアクションを取得します
Point Positionタッチ ポイントの場所を取得します

最後にActionにてタッチの種類を判別することが可能ですが、その種類は下記の表の3種類が得ることが可能です。

Actionの種類概要
Down画面に指を置く操作
Move画面上を指でドラッグする操作
Up画面から指を離す操作

Actionについてですがディスプレイをタッチした状態で指を動作すると下記のような順にActionが得られます

  1. ディスプレイをタッチ:Down
  2. ディスプレイ上をドラッグ:Move
  3. ディスプレイから指を離す:Up

座標取得とタッチの種類の取得

タッチイベントが発生した際にタッチの種類と座標をTextBlockに表示するサンプルコードになります。
16行目、19行目、22行目はタッチの種類ごとに処理を切り分けて文字の表示内容を変更しています。
■MainPage.xaml.cs

    public partial class MainPage : PhoneApplicationPage
    {
        // コンストラクター
        public MainPage()
        {
            InitializeComponent();
            Touch.FrameReported += new TouchFrameEventHandler(TouchFrameReported);
        }

        private void TouchFrameReported(object sender, TouchFrameEventArgs e)
        {
            TouchPoint touchPoint = e.GetPrimaryTouchPoint(null);

            switch (touchPoint.Action)
            {
                case TouchAction.Down:
                    textBlock1.Text = "Down \nX:" + touchPoint.Position.X + "\tY:" + touchPoint.Position.Y;
                    break;
                case TouchAction.Move:
                    textBlock1.Text = "Move \nX:" + touchPoint.Position.X + "\tY:" + touchPoint.Position.Y;
                    break;
                case TouchAction.Up:
                    textBlock1.Text = "Up \nX:" + touchPoint.Position.X + "\tY:" + touchPoint.Position.Y;
                    break;
            }
        }
    }

画面をタッチしたときにタッチの種類はDownとなります。
そのためTextBlockに17行目のDownが表示されます。
そのたまま指を動かすとタッチの種類はMoveとなるので20行目のMoveが表示され、指を画面から離すとUpと表示されます。
このようにタッチのイベントによって動作を切り分けることに応用できます。

このサンプルコードを動かした時の画面は下図のようになります。

タッチイベントのサンプルコード

TouchクラスからタッチイベントのPosition、Actionから座標や種類が取れるためお絵かきアプリや手書きを行うようなアプリをなどを作ることが可能となります。