マルチタッチ入力による図形の描画

2010年10月29日(金)
PROJECT KySS

タッチ操作で、イラストを拡大・縮小、移動、回転させる

次に作成するサンプルは、図形を、拡大・縮小、移動、回転させる、マニピュレーション機能を使うものです(図3)。

正方形や円では回転の結果を確認しにくいため、ハート型の図形を使います。この図形はExpression Designで作成し、「XAML Silverlight 4 / WPF Canvas」形式でエクスポートしたものです(図4)。もちろん、このような簡単な図形ではなくExpression Designで作成した本格的なイラストでも、あるいはIllustratorで作成してExpression Designにインポートして調整してからエクスポートしたイラストでも、同様に操作することができます。

図3:ハート型の図形が拡大・縮小、移動、回転する(クリックで拡大)

図4:Expression Designで作成した図形を、WPF用にXAML形式でエクスポートして用いる(クリックで拡大)

では、早速サンプルを作成してみましょう。

「File/New/Project」を選択し、開発言語を指定して(本稿ではVisual Basic)、「WPF Application」を選択し、任意の名前でWPFアプリケーションの新規プロジェクト(ここでは「WPF_touch2」プロジェクト)を作成します。

MainWindow.xamlのソースを開き、先と同様、MainWindowのHeightは500、Widthは700に変更してください。Toolboxの「All WPF Controls」のコントロールをダブルクリックして1個レイアウトし、PropertiesのLayoutを展開して、Widthに「650」、Heightに「450」、Marginに「0,0,0,0」を指定します。BrushesのBackgroundプロパティにはWhiteを指定しておきましょう。

Expression Designで作成した図形のXAMLコード(ダウンロードファイル中の素材フォルダ内のheart1.xaml)をテキストエディタで開きます(リスト3)。ルート要素の子要素の要素ごと、Visual Studio 側のXAMLソースのコントロール内に貼り付けます。

リスト3  Expression Designで作成した図形のXAMLコード(heart1.xaml)

貼り付けたら、属性名の接頭辞を削除しておきます。x:NameをNameに変更します。

また、名前が"heart"の要素を選択し、PropertiesのOtherを展開し、IsManipulationEnabledにチェックを付けて、マニピュレーションを可能にしておきます。さらに、要素に対して、2次元平面での変換を実現する要素を追加して、リスト4のようになるように編集します。

リスト4 編集したXAMLコード(MainWindow.xaml)

イベントの追加とロジックの記述

ここで、イベントを追加します。

2点タッチでは、操作開始時にManipulationStarting、操作中にManipulationDelta、操作完了時にManipulationCompletedイベントが発生します。今回はManipulationStartingとManipulationDeltaを使います。

VS2010のXAMLコード画面が表示されている状態で、”Name”属性値が「heart」である要素を選択し、PropertiesのEventsを開きます。ManipulationStartingの入力ボックス内をダブルクリックします。

これは、IsManipulationEnabledプロパティにTrueを設定した要素をタッチした時に発生するイベントです。

ManipulationDeltaについても同様の方法で追加します。これは、タッチ操作により蓄積されていく位置の変更情報を格納するイベントです。ManipulationDeltaイベントが発生すると、操作対象オブジェクトを変換することができます。

その上に、リスト5のように、処理を追加していきます。

まず、ManipulationStartingイベント発生時の処理です。図形を変形させるには、ウィンドウから図形までの相対座標が必要なので、ManipulationContainerプロパティにMeを設定して、タッチ操作する位置がWindowからの相対指定となるようにしておきます。

次に、ManipulationDeltaイベント発生時の処理です。マルチタッチで利用できる情報には、回転角度(Rotation)、拡大縮小率(Scale)、平行移動距離(Translation)、指の幅に対する拡大率(Expansion)があります。このうち、今回は、RotationとScaleとTranslationを使います。

変化の基点とする各XY座標値は、ManipulationOrigin.X およびManipulationOrigin.Yでもとめることができます。

リスト5 拡大縮小、回転、平行移動の処理を追加したロジック・コード(MainWindow.xaml.vb)

今回のサンプルでは、図形の動きが分かりやすく速く動くわけでもありませんが、処理によっては移動を制限したり、減速させる必要があります。その場合は、ManipulationDeltaに対して実装可能な、イナーシャ(慣性運動)がサポートされています。

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています