[WinRT] Windowsでマルチタッチ
前にWPFでマルチタッチを試してみたのと同様のWindowsストアアプリを試しに作ってみた。
Windowsストアアプリを新規作成して、canvasを張り付けてPointerPressed、PointerMoved、PointerReleasedイベントを取るようにする。
これらのイベントでマウス、ペン、タッチのイベントが発生する。
イベントで渡されるPointerRoutedEventArgsのGetCurrentPointで
PointerPointを取得してそのPointerDeviceのPointerDeviceTypeプロパティでマウス、ペン、タッチの区別ができる。
複数タッチを区別するのはPointerPointのPointerIdプロパティで行う。
サンプル:TestMultiTouchWS.zip
/// <summary> /// ポインタープレスイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void canvas_PointerPressed(object sender, PointerRoutedEventArgs e) { PointerPoint point = e.GetCurrentPoint(canvas); // 座標取得 Point p = point.Position; // 図形を生成 Mark mark = null; switch (point.PointerDevice.PointerDeviceType) { case PointerDeviceType.Mouse: mark = Mark.makeMark(getButtonText(point.Properties), Mark.MOUSE_MARK_SIZE, Colors.Blue); break; case PointerDeviceType.Pen: // 筆圧から円のサイズを算出 int size = (int)((Mark.STYLUS_MARK_SIZE_MAX - Mark.STYLUS_MARK_SIZE) * point.Properties.Pressure + Mark.STYLUS_MARK_SIZE); mark = Mark.makeMark(point.PointerId.ToString(), size, Colors.Green); break; case PointerDeviceType.Touch: mark = Mark.makeMark(point.PointerId.ToString(), Mark.TOUCH_MARK_SIZE, Colors.Red); break; } if (mark != null) { // 図形をキャンバスへ追加 canvas.Children.Add(mark.label); canvas.Children.Add(mark.ellipse); canvas.UpdateLayout(); // 座標を指定 mark.SetPos(p); // ポインターをキャプチャ canvas.CapturePointer(e.Pointer); // IDごとに図形を保存 pointerData[point.PointerId] = mark; } } /// <summary> /// ポインタームーブイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void canvas_PointerMoved(object sender, PointerRoutedEventArgs e) { Mark mark; PointerPoint point = e.GetCurrentPoint(canvas); if (point.IsInContact) { // IDごとの図形を取得 mark = pointerData[point.PointerId]; if (point.PointerDevice.PointerDeviceType == PointerDeviceType.Mouse) { // ラベルにマウスのボタンの状態を設定 mark.label.Text = getButtonText(point.Properties); } else if (point.PointerDevice.PointerDeviceType == PointerDeviceType.Pen) { // 筆圧から円のサイズを算出 int size = (int)((Mark.STYLUS_MARK_SIZE_MAX - Mark.STYLUS_MARK_SIZE) * point.Properties.Pressure + Mark.STYLUS_MARK_SIZE); // 図形のサイズを指定 pointerData[point.PointerId].ellipse.Width = size; pointerData[point.PointerId].ellipse.Height = size; canvas.UpdateLayout(); } // 座標を指定 mark.SetPos(point.Position); } } /// <summary> /// ポインターリリースイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void canvas_PointerReleased(object sender, PointerRoutedEventArgs e) { PointerPoint point = e.GetCurrentPoint(canvas); // ポインターのキャプチャをリリース canvas.ReleasePointerCapture(e.Pointer); // 図形を削除 canvas.Children.Remove(pointerData[point.PointerId].label); canvas.Children.Remove(pointerData[point.PointerId].ellipse); pointerData.Remove(point.PointerId); }
« TypeScriptメモ(6) ジェネリクス | トップページ | フォルダーにぶち込むと画像をJPG一括変換「フォルダアクション」がスゴイ|Mac - 週アスPLUS »
「プログラミング」カテゴリの記事
- Wii UでBASIC言語のプログラミングができる『プチコンBIG』が12月14日配信開始 - ファミ通.com(2016.12.07)
- プログラミング関係は別ブログに~(2015.04.21)
- Amazon.co.jp: 関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間: 岡部健: 本(2015.04.13)
- α版のリリースから1年4カ月、「Node.js Tools for Visual Studio」v1.0が正式版に - 窓の杜(2015.03.26)
- Nodeビギナーズブック » Node.jsチュートリアル » Node.js 教程(2015.03.13)
「WinRT」カテゴリの記事
- [WinRT] Windowsでマルチタッチ(2014.10.12)
この記事へのコメントは終了しました。
« TypeScriptメモ(6) ジェネリクス | トップページ | フォルダーにぶち込むと画像をJPG一括変換「フォルダアクション」がスゴイ|Mac - 週アスPLUS »
コメント