Top Banner
WinRT のマルチタッチ マニピュレーション 瀬尾佳隆 (@seosoft) Microsoft MVP for Visual C# 技術ひろば.net 勉強会 201210
29

WinRT のマルチタッチマニピュレーション

May 28, 2015

Download

Technology

Yoshitaka Seo

技術ひろば.net 勉強会2012年10月 (10月27日開催) セッション資料
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: WinRT のマルチタッチマニピュレーション

WinRT のマルチタッチ マニピュレーション

瀬尾佳隆 (@seosoft) Microsoft MVP for Visual C#

技術ひろば.net 勉強会 2012年10月

Page 2: WinRT のマルチタッチマニピュレーション

自己紹介

瀬尾 佳隆 (せお よしたか)

MVP for Visual C# (Jan 2009 – Dec 2012)

マルチタッチ好き

Silverlight でも力技の “マルチタッチ” ネタやりました (決して詳しいわけではないんですが :-P)

ブログ・・・http://yseosoft.wordpress.com/

Twitter ・・・@seosoft

劇団四季とディズニーリゾートと AKB48 が好き

Page 3: WinRT のマルチタッチマニピュレーション

アジェンダ

タッチで描画

指とマウスとの違い(サイズ以外で)

マルチタッチでオブジェクト操作

まとめ

Page 4: WinRT のマルチタッチマニピュレーション

本日の結論

WinRT のマルチタッチマニピュレーションは とっても簡単

ほぼ定型的なコードで実現できます

深追いはしないほうがいいと思います

線形代数が好き!ならば止めませんが :-P

Page 5: WinRT のマルチタッチマニピュレーション

タッチで描画

Page 6: WinRT のマルチタッチマニピュレーション

ポインティングデバイスの位置づけ

WinRT

マウスは “ポインティングデバイスの一つ” という位置づけ

デバイス種類はイベント引数で判別できます

デスクトップ / Silverlight

“タッチも使えます” という位置づけ

タッチイベントは自動的にマウスイベントに昇格

専用のタッチイベント (WPF) や タッチクラス (SL)

Page 7: WinRT のマルチタッチマニピュレーション

PointerXXX イベント

タッチもマウスも PointerXXX イベント

MouseXXX はありません

Up / Down ではなく Pressed / Released

Pointer. PointerDeviceType で取得できます

Page 8: WinRT のマルチタッチマニピュレーション

ポインター判別(どの指のイベント?)

どのポインター(=指)のイベントなのかは PointerId で識別できます

Pressed から Released まで同じ ID (uint 型) で イベント発行されます

Dictionary で管理するといいでしょう

Page 9: WinRT のマルチタッチマニピュレーション

シングル/マルチタッチの判別

e.Cumulative.Scale == 1.0 ならばシングルタッチ、 そうでなければマルチタッチ

Page 10: WinRT のマルチタッチマニピュレーション

タッチ描画の例 (1/2)

Page 11: WinRT のマルチタッチマニピュレーション

タッチ描画の例 (2/2)

Page 12: WinRT のマルチタッチマニピュレーション

指とマウスとの違い(サイズ以外にも)

Page 13: WinRT のマルチタッチマニピュレーション

指先は “変形” する

指とマウスとの違いは、領域のサイズだけ ではありません

スクリーンとの摩擦で、指先は “変形” します

滑らかに移動したつもりでも、ギザギザ

Page 14: WinRT のマルチタッチマニピュレーション

InkManager でベジェ曲線に変換

ベジェ曲線に変換すれば滑らかな曲線に

InkManager を使えば簡単に BezierSegment (ベジェ曲線の要素) が作れます

ただしリアルタイムに描画するのはできません

変換した線は PoiterReleased のタイミングで描画

Page 15: WinRT のマルチタッチマニピュレーション

ベジェ曲線への変換の例 (1/3)

Page 16: WinRT のマルチタッチマニピュレーション

ベジェ曲線への変換の例 (2/3)

Page 17: WinRT のマルチタッチマニピュレーション

ベジェ曲線への変換の例 (3/3)

InkStrokeRenderingSegment を BezierSegment に変換

Page 18: WinRT のマルチタッチマニピュレーション

マルチタッチでオブジェクト操作

Page 19: WinRT のマルチタッチマニピュレーション

WinRT ではオブジェクト操作が簡単

オブジェクトを移動、拡大・縮小、回転

ManipulationDelta イベント

前回のイベントからの Delta 値が得られます

Delta 値 = 移動、拡大率、回転角の値

CompositeTransform クラス

座標変換はメソッドではなくてプロパティで指定

オブジェクトの RenderTransform プロパティ

Page 20: WinRT のマルチタッチマニピュレーション

初期化コードは定型的

Page 21: WinRT のマルチタッチマニピュレーション

オブジェクトの移動

X方向、Y方向の移動量を CompositeTransform.TranslateX / Y に代入

前回の Delta イベントからの移動量は e.Delta.Translate に入っています

タッチ開始後の変化総量は e.Cumulative に入っています

Page 22: WinRT のマルチタッチマニピュレーション

オブジェクトの拡大・縮小

X方向、Y方向の拡大率を CompositeTransform.ScaleX / Y に代入

X方向、Y方向それぞれに指定します

中心点(原点)の指定が大事

Page 23: WinRT のマルチタッチマニピュレーション

オブジェクトの回転

回転角を CompositeTransform.Rotation に代入

これも原点(中心点)の指定が大事

Page 24: WinRT のマルチタッチマニピュレーション

中心点は大事

中心

見た目に似ていても、 どこを中心にするかで座標変換は異なる

Page 25: WinRT のマルチタッチマニピュレーション

移動、拡大、回転の組み合わせ

何も考えずに CompositeTransform の それぞれのプロパティに値を代入するだけ

座標変換は任意の座標変換の組み合わせ

東に 0.5m、北に 1m、東に 0.5m 進むのと 北東に 1.4m 進むのとは結果は同じ

ちゃんとした議論をしたい方は線形代数の 参考書をどうぞ

Page 26: WinRT のマルチタッチマニピュレーション

まとめと参考

Page 27: WinRT のマルチタッチマニピュレーション

ちゃんとした議論をしたい方のために

はい、どうぞ!

http://bit.ly/SLTouch2

Page 28: WinRT のマルチタッチマニピュレーション

本日の結論

WinRT のマルチタッチマニピュレーションは とっても簡単

ほぼ定型的なコードで実現できます

深追いはしないほうがいいと思います

線形代数が好き!ならば止めませんが :-P

Page 29: WinRT のマルチタッチマニピュレーション

参考

MSDN:ストアアプリドキュメント

クイック スタート: タッチ入力

http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh465387.aspx

瀬尾の過去のセッション資料

Silverlight で作るマルチタッチアプリケーション

http://bit.ly/SLTouch

http://bit.ly/SLTouch2