1. ホーム
  2. android

[解決済み] onTouchEvent()で移動とクリックを区別する方法は?

2023-07-09 07:48:02

質問

私のアプリケーションでは、移動イベントとクリックイベントの両方を処理する必要があります。

クリックは、1つのACTION_DOWNアクション、いくつかのACTION_MOVEアクション、1つのACTION_UPアクションのシーケンスです。理論的には、ACTION_DOWNイベントとACTION_UPイベントを取得した場合、ユーザーがビューをクリックしたことを意味します。

しかし、実際には、このシーケンスは一部のデバイスでは機能しません。私の Samsung Galaxy Gio では、私のビューをクリックすると、このようなシーケンスが発生します。ACTION_DOWN、数回の ACTION_MOVE、そして ACTION_UP です。つまり、ACTION_MOVEのアクションコードで予期しないOnTouchEventが発生することがあります。私はシーケンスACTION_DOWN ->ACTION_UPを得ることはありません(またはほとんどありません)。

また、クリックの位置を与えないので、OnClickListenerを使用することができません。どのようにクリックイベントを検出し、移動と区別することができますか?

どのように解決するのですか?

非常にシンプルで、指の動きを気にする必要のない別の解決策を紹介します。クリックを単に移動した距離と見なす場合、クリックとロング クリックをどのように区別するのでしょうか。

しかし、ユーザーが 200 ミリ秒以内に移動できる距離が、クリックとは対照的に移動を構成すべき例には、まだ出会っていません。

setOnTouchListener(new OnTouchListener() {
    private static final int MAX_CLICK_DURATION = 200;
    private long startClickTime;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                startClickTime = Calendar.getInstance().getTimeInMillis();
                break;
            }
            case MotionEvent.ACTION_UP: {
                long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
                if(clickDuration < MAX_CLICK_DURATION) {
                    //click event has occurred
                }
            }
        }
        return true;
    }
});