diaryこの広告は、90日以上更新していないブログに表示しています。・・(済)表示されている間は一部の入力以外は受け付けない(ブロックする)自身の上に予め登録されたGUIを描画でき、そのGUIだけは入力を受け付ける昨日は半透明な領域の描画を実装したので、残る部分に関しても実装していく。(実装しながら書いている)タップ、キーボード(トラックボール)による操作を無効にする重要な機能として表示されている間は配下のビューが操作できないように一切の操作をブロック(阻止)する必要がある。GlassPaneのスーパクラス、ひいては全てのレイアウトのスーパクラスであるViewGroup抽象クラスにはdispatch〜(イベント名)という名前のメソッドが定義されており、Androidのビュー上で発生したイベントはこのメソッドを辿ることで伝搬していく。Viwer"で見ると解りやすい。(一部階層を省略しているが)このビュー階層の上から下にイベントは伝搬される。dispatch〜メソッドをオーバライドして、内部でイベントの伝搬を止めることで入力をブロックする。}戻り値にtrueを戻すことでイベントは「消費された」と見なされ、以降の子孫階層にイベントは伝搬しない。この状態でテストしてみたが、GlassPaneの背後(実際には子供)のビューがキーボード、タッチ(有ればトラックボール)に反応しなくなることが確認できる。(エミュレータにはトラックボールは無いが、F6を押下するとトラックボールモード(左上にボールが表示される)に切り替わる(DELキーを押下している間だけトラックボールのモードにすることも可能)さて、入力をブロックできたのは良いが困ったことが見つかった。ブロック状態から抜ける手段が無い1.に関して、Homeキーは元々アプリケーション側では無効にできないので良いが、その他の重要なBackキーやMenuキー、ハードウェアを直接制御するキー(フックup/downや音量up/down等)等、機器の最低限の操作を行うために一部の操作だけは有効にしておかなければならない。これらの制御の方法としてはイベントのキーコードやイベント状態を直接判定すれば良いのだが、KeyEventクラスには便利な状態検査のためのメソッドがあるので、それを使うことでコードをシンプルにできる。}2.上記の方法で他のアプリケーションに制御を移すことはできるようになったが、依然としてアプリケーション側からブロック/ブロック解除を制御することができない。これではコンポーネントとしては使えないので、GlassPaneの状態を制御するためのメソッドを追加することにする。}lockとunlockでは描画オブジェクトを切替えるのではなく描画オブジェクトのアルファ値を変更するだけで見た目を変えている。(アンロック時はアルファ値=0で透過つまり見えなくなる)このお陰でdispatchDrawは書き直す必要は無く、必要なのは状態変数lockで現在ロック中か否かを判定して、先ほど無条件でブロックしていた各イベントを通すようにすることだ。}これでlock中のみ入力をブロックするようにできる。サンプルを使って実際に動かしてみよう。ロック中はGlassPaneではイベントを拾えないので、面倒だが(どんだけ面倒くさがりだよ)オプションメニューで状態をトグルするようにしてみた。}}では実行してみよう。(メニュー選択後)このように、アプリケーション側でロック/アンロックを制御できるようになった。ガラス区画上に任意のビューを配置できるようにするさて、あと一つ残っているが、またもや長くなったので続きはまた今度。2月別アーカイブはてなブログをはじめよう!Kazzzさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。