今回はWindowsストアアプリでもLeapを使ってみることにしましょう。サンプルは以下のURLで公開しています。
紹介するサンプルは、Leapで検出している指先の数を表示するC#のアプリです。
全体の流れとして、MVVM(Model-View-ViewModel)パターンで構成されています。
このフローに合わせてコードを読み進めてみましょう。
初めにViewを見てみましょう。Viewに該当するファイルは「View/MainPage.xaml」「View/MainPage.xaml.cs」です。
まずMainPage.xaml.csで、ViewModelをDataContextに指定しています。
public MainPage()
{
this.InitializeComponent();
this.DataContext = this.ViewModel;
}
次にアプリ起動時にLeapをスタートするようにViewModelに伝えています。
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
this.ViewModel.LeapStart();
}
アプリ終了時にはLeapも終了するように伝えています。
protected override void SaveState(Dictionary<String, Object> pageState)
{
this.ViewModel.LeapStop();
}
次に、ViewがViewModelにLeapをスタートするように命令した先を見てみましょう。ViewModelのコードは「ViewModels/MainViewModel.cs」です。MainPage.xaml.csで呼び出された、StartとStopの処理があります。StartとStopはModel、つまりLeapの処理をするメインのコードで行われるため、Modelのメソッドを呼び出しています。
public void LeapStart()
{
this.Model.LeapStart();
}
public void LeapStop()
{
this.Model.LeapStop();
}
最後に、Leapの処理を行っている「Models/LeapModel.cs」を見てみましょう。ViewModelからLeapのStartが呼び出されると、イベントハンドラとLeapのフレームを処理するListenerが登録されます。Stopされたときは、登録したイベントハンドラとListenerを削除します。
public void LeapStart()
{
this.LeapListener = new SampleListener();
this.LeapListener.Data += new SampleListener.DataHandler(this.LeapListener_Data);
this.LeapController = new Controller();
this.LeapController.AddListener(this.LeapListener);
}
public void LeapStop()
{
this.LeapController.RemoveListener(this.LeapListener);
this.LeapController.Dispose();
this.LeapListener.Data -= new SampleListener.DataHandler(this.LeapListener_Data);
this.LeapListener = null;
}
登録したLeapListener_Dataは1フレームごとに処理を行う最後で呼び出されます。
今回は検出した指の数をViewModelに伝えています。
private void LeapListener_Data(object sender, TPos e)
{
this.Item = new TItem
{
FingerCount = e.FingerCount
};
}
次にLeapで検出したフレームの処理を行う、Listenerを見てみましょう。Leap SDKを使うと、OnFrame()がSDKから毎フレーム呼び出されます。OnFrame()では、leapFrame.Fingers.Count()で指の数を取得して、Dataを更新しています。
internal class SampleListener : Listener
{
private TPos Pos;
public SampleListener()
{
this.Pos = new TPos();
}
public delegate void DataHandler(object sender, TPos e);
public event DataHandler Data;
protected virtual void OnData(TPos e)
{
if (Data != null)
Data(this, e);
}
public override void OnFrame(Controller _controller)
{
Frame leapFrame = _controller.Frame();
if (!leapFrame.Hands.Empty)
{
this.Pos.FingerCount = leapFrame.Fingers.Count();
OnData(this.Pos);
}
}
}
データが更新されると、ViewModelにデータが更新されたことが伝えられ、Viewに登録されているDataContextが更新されます。
Viewに指の数を表示するにはTextBlockにDataContextをBindingすればよいでしょう。MainPage.xamlに記述している以下のTextBlockで指の数を表示しています。
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="{Binding Item.FingerCount}" VerticalAlignment="Center" FontSize="96"/>
これで、検出した指の数が数値で表示されました。
Copyright © ITmedia, Inc. All Rights Reserved.