onTouch()の ACTION_MOVE の発生状況が思惑と違っていた。ので、ロングプレスが判断できない。現状は、シングルタップ、ダブルタップが確定。
public class MainActivity extends AppCompatActivity {
private boolean singleTapFlag = false;
private long downTime = 0, upTime = 0;
private final static long DOUBLE_TAP_IDOLTIME = 250;
private final static long LONG_PRESS_IDOLTIME = 600;
View mLayoutView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* 中略 */
mLayoutView = findViewById( R.id.L_layout );
mLayoutView.setOnTouchListener( new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event);
switch ( action ) {
case ( MotionEvent.ACTION_DOWN ):
singleTapFlag = true; // シングルタップ予約
mX = event.getX(); // 予約
mY = event.getY(); // 予約
downTime = System.currentTimeMillis(); // 押された時間を記録
if ( downTime < ( upTime + DOUBLE_TAP_IDOLTIME) ) {
singleTapFlag = false; // ダブルタップ決定。シングルタップ予約破棄
; // ダブルタップ処理挿入
} else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if ( singleTapFlag ) { // 待機時間経過しても予約破棄されていない
; // シングルタップ処理挿入
singleTapFlag = false; // 解除
}
}
}, DOUBLE_TAP_IDOLTIME+100 ); // ダブルタップ間隔時間よりちょっと長め待機
}
break;
case ( MotionEvent.ACTION_UP ):
upTime = System.currentTimeMillis(); // 離された時間を記録
break;
case ( MotionEvent.ACTION_MOVE ):
singleTapFlag = false; // シングルタップ予約破棄
break;
}
return true;
}
});
}
ビューの階層は、アクティビティー>縦スク>横スク>ライナーレイアウト>イメビュー。
private GestureDetectorCompat gDetector= new GestureDetectorCompat(this, new MyGestureListener());
サンプルの this(Context)、アクティビティーの階層のタッチイベントだよな~。ライナーレイアウトのコンテキストをぶっこめば、GestureDetectorCompatが使えるんだろうか・・。疲れた楽をしたい!