Android Studio(メモリストのアプリ08_画面を押す離すといった操作)

■画面上の操作イベントについて。
一覧となっているメモの内容をサッと指ではじいて削除するようにしたい。イメージとしては、フリック(フリング?)操作を行う感じ。

スマホの画面を押したりするなどのイベントについてサンプルを作って試してみた。
使うのは、setOnTouchListener と OnGestureListener。Android Developerのサイトを参考にして作ったサンプルが下のもの。getActionMaskedのメソッドは非推奨(deprecated)になっているようなので別のものを使用。

TextViewに対して、画面を押したり、離したり、移動させたりなど行って、出てきたイベントに応じてログを出力する。

package com.example.sampleproject009_touch;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GestureDetectorCompat;

import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {

    private GestureDetectorCompat mDetector;

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

        View tv1 = findViewById(R.id.tv1);
        tv1.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {

                Log.i("test1", "Touch event");
                int action = event.getAction();
                switch (action) {
                    case (MotionEvent.ACTION_DOWN):
                        Log.i("test12", "down");
                        return true;
                    case (MotionEvent.ACTION_MOVE):
                        Log.i("test13", "move");
                        return true;
                    case (MotionEvent.ACTION_UP):
                        Log.i("test14", "up");
                        return true;
                    case (MotionEvent.ACTION_CANCEL):
                        Log.i("test15", "cancel");
                        return true;
                    case (MotionEvent.ACTION_OUTSIDE):
                        Log.i("test16", "outside");
                        return true;
                }
                return true;
            }
        });


        View tv2 = findViewById(R.id.tv2);
        mDetector = new GestureDetectorCompat(this, this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.mDetector.onTouchEvent(event)) {
            Log.i("test2", "gesture_event");
            return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) {
        Log.i("test22", "gesture_down");
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
                           float velocityX, float velocityY) {
        Log.i("test23", "gesture_fling");
        return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
        Log.i("test24", "gesture_long_press");
    }

    @Override
    public void onShowPress(MotionEvent event) {
        Log.i("test25", "gesture_showPress");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        Log.i("test26", "gesture_singleTap-up");
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
                            float distanceY) {
        Log.i("test27", "gesture_on-scroll");
        return true;
    }
}


さっそく実行。
まず、setOnTouchListener を使ったTextView1の画面をポンっと押す(押して離す)。
Touch eventのログは、イベントが発生した時、downやupはイベントの種類に応じて出る。ここでは押した時、離した時でそれぞれ1つずつ、2つのイベントが発生していることが分かる。


次に、画面を押した後、そのまま移動させる。移動するたびにイベントが発生して、最後、離したときにupのログが出る。


次に、OnGestureListener。こちらは、MainActivityに実装しているので、TextView2の上だけでなく、背景や別のViewでもログは出る。TextView1では、このログは出なかったけど、おそらくsetOnTouchListener で上書きされたことになっていると思う。
まず、ポンっと画面を押す(押して離す)。gesture_eventのログは、イベント毎に出る。他はそれぞれの種類に応じて。singleTapUpがこの操作に対応しているよう。


次に画面を押した後にそのまま移動させる。onScrollが対応。


次に、画面を押した後、しばらくそのまま押し続ける。つまり長押し。showPressまですぐにログが出て、しばらくしてlongPressが出る。この状態から移動させてもonScrollは出てこなかった。


最後にサッと指ではじく操作。画面上の移動があるので、onScrollが表示され、最後にonFlingがログとして出ている。このFlingのイベントが発生したときにViewを操作させれば、意図したものを作れそう。


とりあえず、この実装をしてメモリストの方は終わりにする。あとはテストとかコメントとかログ出力とか考えていきたい。