◆PROCESSING 逆引きリファレンス
カテゴリー:スマホ(AndroidMode)
ダブルタップを検知するには(AndroidMode編)
【概要】
PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。
AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。
ダブルタップとは、指でトントンと素早く2回画面をたたく操作です。叩いている途中で指を動かしてはいけません。同じ箇所を素早く連続してたたくのがポイントです。
(画像URL:illust-AC 様:かみたまさん、amiyaoさん)
AndroidModeで画面のダブルタップを検知するには、surfaceTouchEvent 関数とAndroid SDKの GestureDetector # SimpleOnGestureListener を併用して判別します。
surfaceTouchEvent 関数やタッチ系イベント関数( touchStarted など)だけを利用しても頑張れば検知可能ですが、GestureDetector クラスを併用した方が楽ちんです(笑)。
GestureDetector クラスの詳細については「スワイプを検知するには(AndroidMode編)」記事を参照して下さい。
GestureDetector クラスの利用方法について、ポイントだけ紹介すると
- SimpleOnGestureListener を継承したクラス(A)を用意する
- setup()関数で Aクラスのインスタンスを生成する
- surfaceTouchEventでAクラスのonTouchEventを呼び出す
といった処理を行うことになります。
SimpleOnGestureListener を継承したクラス内で onDoubleTapメソッドやonDoubleTapEvent メソッドをオーバライドする事で、ダブルタップを検知することができるようになります。
【詳細】
ダブルタップイベント
boolean onDoubleTapEvent( MotionEvent e) { }
e : 発生したMotionEvent
SimpleOnGestureListener を継承したクラスで、それぞれのメソッドをオーバライドします。
オーバライドするので、上位(super)のイベントを呼び出し、かつ Trueでリターンするのが一般的です。
こんな感じです。
2つあるメソッドの違いですが、onDoubleTap はダブルタップが発生した瞬間に1回だけ呼び出されます。onDoubleTapEvent は、ダブルタップの発生時、その後で指を動かした場合、離した場合に呼び出されます。
注意点は、これらのイベントはマルチタップに対応していない事です。2本以上の指で同時にダブルタップするとイベントが呼び出されません。
複数の指によるダブルタップを検知したい場合は、surfaceTouchEvent 関数やタッチ系イベント関数( touchStarted など)を使って、自力で処理する必要があります。
【関連記事】
- タップを検知するには(AndroidMode編)
- フリック検知するには(AndroidMode編)
- 長押しを検知するには(AndroidMode編)
- スワイプを検知するには(AndroidMode編)
- ピンチを検知するには(AndroidMode編)
- ローテートを検知するには(AndroidMode編)
- 様々なタッチ操作を検知するには(Ke:tai.lib 編)
サンプルプログラム
ダブルタップを検知する例:
ダブルタップを検知して、コンソール領域に情報を表示します。
マルチタップでダブルタップを検知する例:
少し長いですが、自力でマルチタップ時にダブルタップを検出するサンプルを掲載します。
tapPointはタップ座標、startMillsは初回タップ時刻、tapCountはタップ回数の記録用リストです。3つ一組で1つのタップに関する情報を管理しています。
指が離れた際、前回指を離した座標と今回指を離した座標を比較し、近い位置で操作が行われており、かつ反応速度が一定以下の場合、ダブルタップと判定しています。
FIRE_DISTANCE 、FIRE_SPEED 定数を変更する事で、ダブルタップの判定精度を調整してください。
synchronized( lock ) で排他をかけているのは、surfaceTouchEvent と draw が別スレッドで動作している為です。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。