飴屋

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メソッドで信号の処理をすればいいみたいです。

日記一覧