画面に並んだ写真が指の動きに反応して回転するLeap Motionプログラムを作る
プログラム・コード(MainWindow.xaml.vb)
では、次にプログラム・コード(MainWindows.xaml.vbファイル)を見ていきましょう。
コードは4回のコードと似通っている部分については割愛します。4回のコード説明を参照してください。異なる部分のみ解説します。
名前空間の読み込み
「Imports Leap」と「System.Windows.Ink」名前空間の他に、今回はコード内でStoryboardを扱うため「System.Windows.Media.Animation」名前空間を読み込んでおきます。
メンバー変数の宣言
次にメンバー変数を宣言します。
今回もWin32 APIを使用するためにWin32 APIの宣言も行います。4回と同じWin32 APIを使用しています。Win32 APIに関しては4回と同じですが、定数メンバー変数は、
「Private Const MOUSEEVENTF_LEFTDOWN = &H2」
「Private Const MOUSEEVENTF_MOVE = &H1」
の2つを宣言します。
「leap」、「touchIndicator」、「touchPoint」、「windowWidth」、「windowHeight」、「tx」、「ty」、「x」、「y」、「FingersCount」等のメンバー変数については4回と同じのため、そちらの記事を参照してください。
これ以外に、XML要素を表すXElementクラス型のメンバー変数xmldocと、新しいStoryboardのインスタンスstrbメンバー変数を宣言します。また、Imageクラスのメンバー変数myImageも宣言しておきます(リスト3)。
リスト3 メンバー変数の宣言
・・・・コード略・・・ Private xmldoc As XElement Private strb As New Storyboard Private myImage As Image ・・・コード略・・・・
MainWindow_Loadedメソッドの処理
XElemet.LoadメソッドでXML文書(forest.xml)を読み込みます。Descendantsメソッドで全ての子孫要素の内容をresultに格納しながら、以下の処理を繰り返します。
新しいImageのインスタンスmyImageオブジェクトを作成し、Widthに320、Heightに240と指定します。Sourceプロパティに、”Images/”文字列と、要素の値を連結して、指定します。
AddHandlerステートメントで、マウスポインターがmyImageオブジェクトの境界内に入った時に発生するMouseEnterイベントに、イベントハンドラを追加します。
イベントハンドラ内では以下の処理を行います。
myImageの情報を持っているmySenderオブジェクトをDirectcCastでImageにキャストして変数_myImageに格納しておきます。
新しいStoryboardのインスタンスmyStoryBoardを作成します。
2-D x-y座標系内のオブジェクトをスケーリングする新しいScaleTransformのインスタンスmyScaleオブジェクトを作成します。
RenderTransformOriginプロパティで、要素の境界に対する中心点を取得します。
_myImageオブジェクトの描画位置に影響する変換情報にmyScaleオブジェクトを指定します。
新しいDoubleAnimationのインスタンスmyDoubleAnimationオブジェクトを作成します。タイムラインの再生に要する時間に300ミリセカンドと指定します。
アニメーションの開始位置を指定する[From]プロパティに「1」を指定し、アニメーションの終了値を指定する[To]プロパティに「-1」を指定します。
AddメソッドでmySroryboardオブジェクトにmyDoubleAnimationを追加します。
Storyboard.SetTargetPropertyにmyDoubleAnimationとPropertyPathを("RenderTransform.ScaleX")で初期化した新しいインスタンスを指定します。PropertyPathクラスはオブジェクトのデータバインディングと、アニメーションのストーリーボードタイムラインに使用されるクラスです。
StoryBoard.SetTargetでmyDoubleAnimationオブジェクトと、_myImageオブジェクトを指定します。SetTargetは指定したタイムラインが、依存関係オブジェクトを対象にするよう指定します。
同じように、新しいDoubleAnimationのインスタンスmyDoubleAnimation2オブジェクトを作成します。タイムラインの再生に要する時間に1000ミリセカンドと指定します。
アニメーションの開始位置を指定する[From]プロパティに「-1」を指定し、アニメーションの終了値を指定する[To]プロパティに「1」を指定します。
AddメソッドでmySroryboardオブジェクトにmyDoubleAnimation2を追加します。
Storyboard.SetTargetPropertyにmyDoubleAnimation2とPropertyPathを("RenderTransform.ScaleX")で初期化した新しいインスタンスを指定します。PropertyPathクラスはオブジェクトのデータバインディングと、アニメーションのストーリーボードタイムラインに使用されるクラスです。
StoryBoard.SetTargetでmyDoubleAnimation2オブジェクトと、_myImageオブジェクトを指定します。SetTargetは指定したタイムラインが、依存関係オブジェクトを対象にするよう指定します。
BeginメソッドでmyStoryBoardを開始します。
ListBox1にmyImageオブジェクトを追加します。これで、ListBox内に画像が表示されます(リスト4)。
画面に並んだ写真が指の動きに反応して回転するLeap Motionプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 写真を突っついて一覧から削除、並び替えするLeap Motionプログラムを作る
- Leap Motionのスクリーン・タップを使った音声の再生と画像の表示
- TabControlでの画像の切り替えとRichTextBoxの利用
- 好きな写真を指で選んで順番に拡大表示するLeap Motionプログラムを作る
- 張子の虎をキー・タップすると頭が上下に動くLeap Motionプログラムを作る
- Leap Motionで画像のトリミングと保存を行うためのサンプルプログラムを作る
- ストーリーボードでアニメーションを実装する
- Kinect v2の音声認識で「仮面」を選んで変身してみる
- マウス・カーソルで指定した画像の一部を拡大表示するLeap Motionプログラム
- 選択した画像を指の動きに合わせて回転させるLeap Motionプログラムを作る