前回から続けてJPen2やっていきますよ〜。今回はレベルイベントを処理していきます。
PLevelEventを処理する
レベルイベントは値が変化したときに発生するイベントです。そのとき渡されるイベントはPLevelEventです。マウスイベントに変換する際はMOVEDとDRAGEDに相当します。
ポインターの座標、筆圧、傾き、回転角度などが発生元です。
なお、これらの値は前回PButtonEventの処理で解説したときと同様、Penオブジェクトに直接聞きに行って取得するので、説明は省きます。
PenオブジェクトはPLevelEventにもfianl public変数のpenに保持されていますので、そこから取得できます。PenManagerから取得しても良いです。
ポインターを動かしているデバイスが何かも、PButtonEvent同様に、PenオブジェクトからPKindを取得して判断します。
ふぃ〜、PButtonEventで主要な部分は説明してあったのでずいぶん省略できましたヽ( ・∀・)ノ
なので、ここで話すべき内容は、現在どのボタンが押されているのか?の一つだけです。
PLevelEvent発生時にはPButtonEventの時のようにある特定のボタン一つだけがターゲットとは限りません。
右クリックしながら左クリックし、ドラッグするという事もありますよね。SHIFTキーを押しながらドラッグすることもあるでしょう。このように複数のボタンが同時に押されている状況を加味する必要があります。まぁ、そんなに身構えることはないですよ。
デバイスがペンタブレットデバイスの時とシステムマウスデバイスの時とで分けておきましょう。
ちなみに、Pen.hasPressedButtons()という関数で現在押されているボタンがあるかないかを判断できるのですが、コントロール、シフト、アルト3つのキーも追加されてしまったため、これでドラッグしてるかどうかを判断できなくなりました。私の一年前作ったライブラリーが使えなくなった原因です。まぁ、もともとかなり間違ってたから、作り直さないといけなかったんだけど。
タブレットデバイス
PButtonEventの時にも書きましたが、タブレットデバイスでは、ON_PRESSUREとLEFTのイベントが同時に発生します。
しかし、同時に、といっても若干ラグがあるのか
PButtonEvent( LEFT ) → PLevelEvent (LEFTのみ押されている)→PButtonEvent(ON_PRESSURE)→PLevelEvent(LEFT+ON_PRESSUREが押されている)
という風にLEFTのPButtonEventとON_PRESSUREのPButtonEventの間にPLevelEventが挟まれることが起こります。今、私はON_PRESSUREでプレス判定をしているのでLEFTを考慮してしまうとプレスされる前にドラッグされるという謎状態が発生します。おのれ、ナゾーめ!
というわけで、ここでもまたLEFTイベントは無視しちゃうのが一番かなぁとおもっています。
以下に私の実装例を載せておきます。ここでもTabletMouseEventやState,CursorDeviceは私の自作クラスです。
switch(pkind.getType()){ case STYLUS: modify |=TabletMouseEvent.HEAD_MASK; state = State.MOVED; cdev = CursorDevice.TABLET; if(pen.getButtonValue(Type.ON_PRESSURE)){ modify |=BUTTON1_DOWN_MASK|BUTTON1_MASK; state = State.DRAGGED; } if(pen.getButtonValue(Type.CENTER)){ modify |=BUTTON2_DOWN_MASK|BUTTON2_MASK; state = State.DRAGGED; } if(pen.getButtonValue(Type.RIGHT)){ modify |=BUTTON3_DOWN_MASK|BUTTON3_MASK; state = State.DRAGGED; } break; //以下略
マウスデバイス
マウスデバイスはON_PRESSUREは発生しないので、特に注意することはありません。
上のソースコードのON_PRESSUREをLEFTに書き換えれば十分です。簡単だね。
次回残りのPKindEventとPScrollEventとpenTockメソッドを一気に説明して終わりにします。ヽ( ・∀・)ノ