5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Android:GestureDetectorを使いながらMotionEvent.ACTION_UPを検知する

Posted at

結論から書くと、onTouchMotionEvent.ACTION_UPだけを検知させ、他のイベントはGestureDetectorに丸投げすると実現できる。

Javaサンプルコード

Kotlin使いの方は適宜読み替えてください。
GestureDetectorCompatにした場合は未検証ですが、同じ挙動になるはずです。

MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {

    private TextView sampleView;
    private GestureDetector gestureDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sampleView = findViewById(R.id.sampleView);
        sampleView.setOnTouchListener(this);

        gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                // do something
                return true;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                // do something
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                // do something
                super.onLongPress(e);
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                // do something
                return true;
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                // do something
                return true;
            }
        });
    }

    @Override
    public boolean onTouch(View v, MotionEvent e) {
        // ここで指が画面から離れたことを検知し、他のイベントはGestureDetectorに委ねる
        if (e.getAction() == MotionEvent.ACTION_UP) {
            // do something
        }

        return gestureDetector.onTouchEvent(e);
    }
}

補足

コード内の"do something"コメントのところにLogを仕込むと、動きを確認できます。
GestureDetectorでは他にonSingleTapConfirmedonFlingなどもサポートされていますが、ここでは割愛しています。
詳しく知りたい方は、下記URLから公式ドキュメントをご覧ください。

また、上のコードでは#onTouch should call View#performClick when a click is detectedという警告が出ます。
これについては、stackoverflowに回答がありました。

対処としては、onTouch内で以下のようにperformClickを呼んでやると解消できるようです。

        if (e.getAction() == MotionEvent.ACTION_UP) {
            v.performClick();
            // do something
        }

ただ、今回の場合はGestureDetectorでクリックイベントに対処するんだから、わざわざperformClickを呼ぶ意味があるのか?という気がします。
実際、performClickを呼ばなくても動きは問題なく見えます。
OnTouchListenerOnClickListenerを併用している場合には考慮が必要になるのかもしれませんが、とりあえずAndroid Studioの警告を消すためにはperformClickをコールしておくのが無難であるようです。

最後に

記載内容に不備などがありましたら、教えていただけると助かります!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?