Leap Motionアプリ/日記003
Listenerを書く
前回常駐アプリの体裁だけを整えて、Leap Motionとの対話がないままだったので、Leap Motionの声を聴いてみようと思います。Leap Motionの繰り出す信号はListenerクラスを通じて聞き取るらしいのですが、前回ListenerクラスをControllerにAddListenerしてあげても何も起こりませんでした。何か起こすにはListenerクラスを継承して自分で何を起こすのか書く必要があるようです。
class MyListener : Listener
{
private Form1 form;
public MyListener(Form1 f)
{
form = f;
}
public override void OnInit(Controller c)
{
base.OnInit(c);
form.viewBalloon("OnInit");
}
public override void OnConnect(Controller c)
{
base.OnConnect(c);
}
public override void OnFocusGained(Controller c)
{
base.OnFocusGained(c);
form.viewBalloon("OnFocusGained");
}
public override void OnFrame(Controller c)
{
base.OnFrame(c);
//form.viewBalloon("OnFrame");
}
public override void OnFocusLost(Controller c)
{
base.OnFocusLost(c);
form.viewBalloon("OnFocusLost");
}
public override void OnDisconnect(Controller c)
{
base.OnDisconnect(c);
form.viewBalloon("OnDisconnect");
}
public override void OnExit(Controller c)
{
base.OnExit(c);
form.viewBalloon("OnExit");
}
}
というわけで、Listenerを継承したMyListenerというクラスを用意してみました。
内容は
- タスクトレイのアイコンからバルーンチップを表示できるようにコンストラクタでForm1を受け取って保持
- とりあえず、Onで始まるメソッドをあらかたoverrideして、なにか発生したらバルーンチップに表示させることに
- OnFrameメソッドだけは一秒間に何度も呼ばれるようなので、バルーンチップは表示させない
といった感じ。前回、Controllerに渡したListenerをこのMyListenerに置き換えて、どんな時にこれらのメソッドが呼ばれるのか観察してみました。観察しただけじゃわからなかったこともあったのでLeap MotionのAPIリファレンスを確認したら、多分説明が間違っているっぽいので、憶測を含めてListenerのライフサイクルがこんな感じだろうと記してみます。
- OnInit
- Listenerの初期化処理時
- OnConnect
- Listenerが新規にControllerに追加されたとき一度だけ発生
- OnFocusGained
- アプリが最前面に表示されフォーカスを得たとき
- OnFrame
- 指や手の追跡データを逐一お知らせ
- OnFocusLost
- アプリが最前面ではなくなりフォーカスを失ったとき
- OnDisconnect
- ListenerがControllerから破棄されたとき
- OnExit
- Listenerの終端処理時
実用に当たってはOnConnectメソッドでLeap Motionの動作を決めて、OnFrameメソッドで信号の処理をすればいいみたいです。