309 views
この記事は最終更新から 678日 が経過しています。
1. やりたいこと
Androidアプリで
左スワイプ、右スワイプ
を検出したい。
2. やってみる
画面上をスワイプした方向を表示するだけの簡単なアプリを作った。
(1) MainActivity.java #1 OnGestureListener interfaceを実装する。
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { private GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.mGestureDetector = new GestureDetector(this, this); }
(2) MainActivity.java #2 GestureDetectorを生成する。
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { private GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.mGestureDetector = new GestureDetector(this, this); }
(3) MainActivity.java #3 onTouchEventで GestureDetector#onTouchEventを実行する。
@Override public boolean onTouchEvent(MotionEvent event) { return mGestureDetector.onTouchEvent(event); }
(4) MainActivity.java #4 onFlingを overrideし、スワイプ検出処理を実装する。
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int SWIPE_MAX_OFF_PATH = 100; final int SWIPE_MIN_DISTANCE = 50; final int SWIPE_THRESHOLD_VELOCITY = 50; // e1 : swipe開始時 // e2 : swipe終了時 if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { return false; } if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // 画面が左にスワイプされた時の処理 this.tv.setText("← LEFT"); return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // 画面が右にスワイプされた時の処理 this.tv.setText("→ RIGHT"); return true; } return false; }
(5) MainActivity.java #5 他の overrideが必要なメソッドを書く。
@Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { }
3. 付録 : 動作確認済みの全ソースコード
package com.example.testswipe; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { private TextView tv; private GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv = findViewById(R.id.tv_disp); this.mGestureDetector = new GestureDetector(this, this); } @Override public boolean onTouchEvent(MotionEvent event) { this.tv.setText(""); return mGestureDetector.onTouchEvent(event); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int SWIPE_MAX_OFF_PATH = 100; final int SWIPE_MIN_DISTANCE = 50; final int SWIPE_THRESHOLD_VELOCITY = 50; // e1 : swipe開始時 // e2 : swipe終了時 if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { return false; } if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // 画面が左にスワイプされた時の処理 this.tv.setText("← LEFT"); return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // 画面が右にスワイプされた時の処理 this.tv.setText("→ RIGHT"); return true; } return false; } /////////////////////////////////////////////////////////////// // 以下、使用しないが、OnGestureListener interfaceの実装時に overrideが必要なメソッド @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } }