タブレット用プログラムの書き止め

android OS & iPadOS の記録。

タップ処理難航2

2021-06-16 22:33:52 | Android studio 日記

 onTouchEvent()の動作の絡繰りは何となく分かりました。ただ、現実的にそれを制御する手順が見えてこない。そこで onTouchListener()のMotionEvent.ACTION_??、ACTION_DOWN、ACTION_UP、ACTION_MOVE、を利用して、シングルタップ、ダブルタップ、ロングプレスを自作する。

 onTouch()が呼ばれるイベントは、

画面が押されたとき、ACTION_DOWN
画面から離れたとき、ACTION_UP
画面を押さえたまま、ACTION_MOVE(?)

 他にもonTouch()が呼ばれるイベントはありますが、発生しないとonTouch()は呼ばれない。ここがムズイ。

V(DoWN) >(MOVE)> ∧(UP)  押される、押され続ける、離される。その時イベント発生。

判断プロセスを考える。

onTouch()が呼ばれた。
アクションを調べる。

ACTION_DOWN:時間、X座標、Y座標を記録。シングルタップ フラグtrue。
ACTION_MOVE:XY座標が変わらず指定時間以上経ったらロングプレス確定。シングルタップ フラグfalse。
ACTION_UP:
ACTION_DOWN:時間、X座標、Y座標を記録。短い時間で発生ならダブルタップ確定。シングルタップ フラグfalse。

 

 ロングプレス、ダブルタップは、条件を確立できれば問題ない。シングルタップの確定は、onTouch()が呼ばれるイベント発生の条件からムズイ。ダブルタップの条件から外れたものをシングルタップ確定としなければならない。

1、ACTION_DOWNでシングルタップflagを立てる。
2、ダブルタップの時間間隔を待つ。
3、ダブルタップされたらシングルタップflagを下す。
4、ダブルタップの時間間隔を過ぎている。
5、ACTION_MOVEでXY座標移動がある。シングルタップflagを下す。
6、ACTION_MOVEは続いている。XY座標移動はない。move flagを立ててシングルタップ確定を保留させる。
7、ACTION_MOVEは続いている。ロングプレス設定時間過ぎて確定。シングルタップflagを下す。

 シングルタップflagが立っていて、条件クリアになったらシングルタップが確定する。ですが、「ダブルタップの時間間隔を過ぎている。」onTouch()では取り出せないし判断できない。なので、Handler()の遅延実行。ACTION_DOWNで遅延実行をセット。ダブルタップの時間間隔を過ぎていて、シングルタップフラグが立っていたらシングルタップの時の処理を実行する。そして、すべてのフラグをリセット。

 これから、Handler()の勉強だ。思った通りの作動ができるのだろうか・・。onTouchEvent()を通すほうがスマートなんだけどなぁ。技術がないのだから仕方がない。アプリになって動作が同じなら気にすることではない。と思いたい。