一般的な操作を検出する

Compose を試す
Jetpack Compose は、Android に推奨される UI ツールキットです。Compose でタップと入力を使用する方法について学習します。
<ph type="x-smartling-placeholder"></ph> ジェスチャー →

タップ操作は、タッチペンに指を 1 本以上置くと アプリはこのタップパターンを操作として解釈します。そこで、 ジェスチャー検出には 2 つのフェーズがあります。

  1. タッチイベント データを収集しています。
  2. データを解釈して、 アプリがサポートするジェスチャーを選択できます

AndroidX クラス

このドキュメントの例では、 GestureDetectorCompat および MotionEventCompat 。これらのクラスは AndroidX Library にあります。可能であれば AndroidX クラスを使用して、 以前のデバイスで使えます MotionEventCompat は、 MotionEvent クラスです。静的ユーティリティ メソッドを提供し、 関連するアクションを受け取る MotionEvent オブジェクト。 イベントです。

データの収集

ユーザーが 1 本以上の指を画面の上に置くと、 コールバック onTouchEvent() タッチイベントを受け取るビューに割り当てられます。タッチのシーケンスごとに 位置、圧力、サイズ、他の検出値の追加などの 指 - ジェスチャーとして識別され、onTouchEvent() は トリガーされます。

ユーザーが画面に最初に触れたときにジェスチャーが開始され、 システムはユーザーの指の位置を追跡し、 最後の指が画面から離れる最後のイベントをキャプチャします。 このやり取り全体を通して、MotionEvent は以下を配信しました: onTouchEvent() は、すべてのインタラクションの詳細を提供します。アプリ MotionEvent から提供されるデータを使用して、 実行できます。

Activity または View のタップイベントをキャプチャする

Activity または View の場合は、onTouchEvent() コールバックをオーバーライドします。

次のコード スニペットでは、 getAction() ユーザーが行うアクションを event パラメータから抽出します。 これにより、重視するジェスチャーかどうかを判断するために必要な生データが得られます 発生します。

Kotlin

class MainActivity : Activity() {
    ...
    // This example shows an Activity. You can use the same approach if you are 
    // subclassing a View.
    override fun onTouchEvent(event: MotionEvent): Boolean {
        return when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                Log.d(DEBUG_TAG, "Action was DOWN")
                true
            }
            MotionEvent.ACTION_MOVE -> {
                Log.d(DEBUG_TAG, "Action was MOVE")
                true
            }
            MotionEvent.ACTION_UP -> {
                Log.d(DEBUG_TAG, "Action was UP")
                true
            }
            MotionEvent.ACTION_CANCEL -> {
                Log.d(DEBUG_TAG, "Action was CANCEL")
                true
            }
            MotionEvent.ACTION_OUTSIDE -> {
                Log.d(DEBUG_TAG, "Movement occurred outside bounds of current screen element")
                true
            }
            else -> super.onTouchEvent(event)
        }
    }
}

Java

public class MainActivity extends Activity {
...
// This example shows an Activity. You can use the same approach if you are
// subclassing a View.
@Override
public boolean onTouchEvent(MotionEvent event){
    switch(event.getAction()) {
        case (MotionEvent.ACTION_DOWN) :
            Log.d(DEBUG_TAG,"Action was DOWN");
            return true;
        case (MotionEvent.ACTION_MOVE) :
            Log.d(DEBUG_TAG,"Action was MOVE");
            return true;
        case (MotionEvent.ACTION_UP) :
            Log.d(DEBUG_TAG,"Action was UP");
            return true;
        case (MotionEvent.ACTION_CANCEL) :
            Log.d(DEBUG_TAG,"Action was CANCEL");
            return true;
        case (MotionEvent.ACTION_OUTSIDE) :
            Log.d(DEBUG_TAG,"Movement occurred outside bounds of current screen element");
            return true;
        default :
            return super.onTouchEvent(event);
    }
}

このコードは、ユーザーがタップすると次のようなメッセージが Logcat に生成されます。 タッチと保留、ドラッグ:

GESTURES D   Action was DOWN
GESTURES D   Action was UP
GESTURES D   Action was MOVE

カスタム ジェスチャーについては、これらのイベントに対して独自の処理を行って、 処理する必要があるジェスチャーかどうかを判断できます。ただし、 アプリで一般的な操作(ダブルタップ、タップ、長押し、フリングなど Chronicle の GestureDetector クラスです。GestureDetector を使用すると、 個々のタッチイベントをご自身で処理せずにジェスチャーを行えます。これは、 詳しくは、ジェスチャーを検出するをご覧ください。

単一のビューのタップイベントをキャプチャする

onTouchEvent() の代わりに、 View.OnTouchListener 任意の View にマッピングできます。 オブジェクトの setOnTouchListener() メソッドを呼び出します。これにより、 既存の View を作成します。

Kotlin

findViewById<View>(R.id.my_view).setOnTouchListener { v, event ->
    // Respond to touch events.
    true
}

Java

View myView = findViewById(R.id.my_view);
myView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        // Respond to touch events.
        return true;
    }
});

false を返すリスナーを ACTION_DOWN イベント。 そのようにした場合、後続のイベントに対してリスナーが ACTION_MOVEACTION_UP シーケンス できます。これは、ACTION_DOWN がすべての開始点であるためです。 タッチイベント。

カスタムビューを作成する場合は onTouchEvent()。前述のとおりです。

操作の検出

Android には、一般的なリソースを検出するための GestureDetector クラスが 行います。サポートされているジェスチャーは次のとおりです。 onDown(), onLongPress(), および onFling()GestureDetector は、次と組み合わせて使用できます。 前に説明した onTouchEvent() メソッド。

サポートされている操作をすべて検出する

GestureDetectorCompat オブジェクトをインスタンス化すると、 渡すクラスは、この関数を実装するクラスです。 GestureDetector.OnGestureListener 行うことができます。GestureDetector.OnGestureListener は、 特定のタッチイベントが発生します。お客様が GestureDetector オブジェクトを使用してイベントを受信し、ビューをオーバーライドするか、 アクティビティの onTouchEvent() メソッドを使用し、確認されたすべてのイベントを渡します。 検出インスタンスに送信されます。

次のスニペットでは、オブジェクトから true の戻り値が 個々の on<TouchEvent> メソッドが、 タッチイベントが処理されます。false の戻り値でイベントを下に渡す ビュースタックを通過する必要があります。

次のスニペットをテストアプリで実行すると、 タッチ スクリーンを操作したときにアクションがトリガーされ、 MotionEvent の内容はタッチイベントごと。すると、 単純なインタラクションで生成されるデータの量です。

Kotlin

private const val DEBUG_TAG = "Gestures"

class MainActivity :
        Activity(),
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener {

    private lateinit var mDetector: GestureDetectorCompat

    // Called when the activity is first created.
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener.
        mDetector = GestureDetectorCompat(this, this)
        // Set the gesture detector as the double-tap
        // listener.
        mDetector.setOnDoubleTapListener(this)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return if (mDetector.onTouchEvent(event)) {
            true
        } else {
            super.onTouchEvent(event)
        }
    }

    override fun onDown(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onDown: $event")
        return true
    }

    override fun onFling(
            event1: MotionEvent,
            event2: MotionEvent,
            velocityX: Float,
            velocityY: Float
    ): Boolean {
        Log.d(DEBUG_TAG, "onFling: $event1 $event2")
        return true
    }

    override fun onLongPress(event: MotionEvent) {
        Log.d(DEBUG_TAG, "onLongPress: $event")
    }

    override fun onScroll(
            event1: MotionEvent,
            event2: MotionEvent,
            distanceX: Float,
            distanceY: Float
    ): Boolean {
        Log.d(DEBUG_TAG, "onScroll: $event1 $event2")
        return true
    }

    override fun onShowPress(event: MotionEvent) {
        Log.d(DEBUG_TAG, "onShowPress: $event")
    }

    override fun onSingleTapUp(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onSingleTapUp: $event")
        return true
    }

    override fun onDoubleTap(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onDoubleTap: $event")
        return true
    }

    override fun onDoubleTapEvent(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: $event")
        return true
    }

    override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: $event")
        return true
    }

}

Java

public class MainActivity extends Activity implements
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener{

    private static final String DEBUG_TAG = "Gestures";
    private GestureDetectorCompat mDetector;

    // Called when the activity is first created.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener.
        mDetector = new GestureDetectorCompat(this,this);
        // Set the gesture detector as the double-tap
        // listener.
        mDetector.setOnDoubleTapListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        if (this.mDetector.onTouchEvent(event)) {
            return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) {
        Log.d(DEBUG_TAG,"onDown: " + event.toString());
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
            float velocityX, float velocityY) {
        Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
        return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
    }

    @Override
    public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
            float distanceY) {
        Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
        return true;
    }

    @Override
    public void onShowPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
        return true;
    }
}

サポートされている操作のサブセットを検出する

少数のジェスチャーのみを処理したい場合は、 GestureDetector.SimpleOnGestureListener GestureDetector.OnGestureListener を実装する代わりに、 行うことができます。

GestureDetector.SimpleOnGestureListener は、 実装の on<TouchEvent> メソッドを そのすべてで false。これにより、kubectl の「get」コマンドや 考えていますたとえば、次のコード スニペットは、 GestureDetector.SimpleOnGestureListener とオーバーライド onFling()onDown()

GestureDetector.OnGestureListener または GestureDetector.SimpleOnGestureListener にすることをおすすめします。 true を返す onDown() メソッドを実装する。この これは、すべてのジェスチャーが onDown() メッセージで始まるためです。もし onDown() から false を返します。 GestureDetector.SimpleOnGestureListener はデフォルトで、 は、残りの操作を無視すると仮定します。 GestureDetector.OnGestureListener は呼び出されません。これにより、 想定外の問題が起きることがありますfalse のみ返品可能: 操作全体を無視する場合は onDown() を指定します。

Kotlin

private const val DEBUG_TAG = "Gestures"

class MainActivity : Activity() {

    private lateinit var mDetector: GestureDetectorCompat

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mDetector = GestureDetectorCompat(this, MyGestureListener())
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mDetector.onTouchEvent(event)
        return super.onTouchEvent(event)
    }

    private class MyGestureListener : GestureDetector.SimpleOnGestureListener() {

        override fun onDown(event: MotionEvent): Boolean {
            Log.d(DEBUG_TAG, "onDown: $event")
            return true
        }

        override fun onFling(
                event1: MotionEvent,
                event2: MotionEvent,
                velocityX: Float,
                velocityY: Float
        ): Boolean {
            Log.d(DEBUG_TAG, "onFling: $event1 $event2")
            return true
        }
    }
}

Java

public class MainActivity extends Activity {

    private GestureDetectorCompat mDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDetector = new GestureDetectorCompat(this, new MyGestureListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        if (this.mDetector.onTouchEvent(event)) {
              return true;
        }
        return super.onTouchEvent(event);
    }

    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        private static final String DEBUG_TAG = "Gestures";

        @Override
        public boolean onDown(MotionEvent event) {
            Log.d(DEBUG_TAG,"onDown: " + event.toString());
            return true;
        }

        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,
                float velocityX, float velocityY) {
            Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
            return true;
        }
    }
}

参考情報