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

android OS & iPadOS の記録。

タップ処理難航3

2021-06-18 00:41:07 | Android studio 日記

 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が使えるんだろうか・・。疲れた楽をしたい!