Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidで左右のスワイプジェスチャを検出・処理する方法

この記事では、Androidアプリで右から左(左スワイプ)および左から右(右スワイプ)のスワイプジェスチャを検出して処理する方法を、サンプルコード付きで解説します。標準APIのGestureDetectorクラスとカスタムタッチリスナーを組み合わせることで、スワイプ操作を簡単に実装できます。

手順1:Android Studioで新規プロジェクトを作成する

まず、Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

手順2:レイアウトファイル(activity_main.xml)にコードを追加する

res/layout/activity_main.xml に以下のコードを記述します。画面中央には、スワイプ操作を促すテキストを配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp"
    android:id="@+id/relativeLayout"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:layout_centerInParent="true"
        android:textSize="16sp"
        android:textStyle="bold"
        android:text="Swipe Left to right and Right to Left to detect Swipe Gesture"/>
</RelativeLayout>

手順3:MainActivity.javaにコードを追加する

src/MainActivity.java に以下のコードを記述します。レイアウト全体に対して setOnTouchListener() を設定し、スワイプが検出されたときにToastメッセージを表示します。

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    RelativeLayout layout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        layout = findViewById(R.id.relativeLayout);
        layout.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {
            @Override
            public void onSwipeLeft() {
                super.onSwipeLeft();
                Toast.makeText(MainActivity.this, "Swipe Left gesture detected", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onSwipeRight() {
                super.onSwipeRight();
                Toast.makeText(MainActivity.this, "Swipe Right gesture detected", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

手順4:OnSwipeTouchListener.javaクラスを作成する

次に、新しいJavaクラス「OnSwipeTouchListener.java」を作成し、以下のコードを追加します。このクラスでは、GestureDetector.SimpleOnGestureListeneronFling() メソッドをオーバーライドし、指の移動距離(diffX / diffY)と速度(velocityX / velocityY)をもとに、上下左右どの方向へスワイプされたかを判定しています。

import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
class OnSwipeTouchListener implements View.OnTouchListener {
    private GestureDetector gestureDetector;
    OnSwipeTouchListener(Context c) {
        gestureDetector = new GestureDetector(c, new GestureListener());
    }
    public boolean onTouch(final View view, final MotionEvent motionEvent) {
        return gestureDetector.onTouchEvent(motionEvent);
    }
    private final class GestureListener extends
    GestureDetector.SimpleOnGestureListener {
        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;
        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            onClick();
            return super.onSingleTapUp(e);
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            onDoubleClick();
            return super.onDoubleTap(e);
        }
        @Override
        public void onLongPress(MotionEvent e) {
            onLongClick();
            super.onLongPress(e);
        }
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                    }
                }
                else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeDown();
                        } else {
                            onSwipeUp();
                        }
                    }
                }
            }
            catch (Exception exception) {
                exception.printStackTrace();
            }
            return false;
        }
    }
    public void onSwipeRight() {
    }
    public void onSwipeLeft() {
    }
    private void onSwipeUp() {
    }
    private void onSwipeDown() {
    }
    private void onClick() {
    }
    private void onDoubleClick() {
    }
    private void onLongClick() {
    }
}

ポイントとして、横方向の移動量が縦方向より大きい場合は左右スワイプ、逆の場合は上下スワイプとして判定されます。また、誤検出を防ぐため、移動距離とフリング速度の両方がしきい値(ここではそれぞれ100)を超えた場合のみジェスチャとして認識する仕組みになっています。

手順5:AndroidManifest.xmlにコードを追加する

androidManifest.xml に以下のコードを記述します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行して動作を確認する

それでは、アプリケーションを実行してみましょう。実機のAndroidスマートフォンをパソコンにUSB接続していることを前提に説明します。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイス選択画面で接続したモバイル端末を選ぶと、端末上にアプリの初期画面が表示されます。

画面上で指を左右にスワイプすると、スワイプの方向に応じて「Swipe Left gesture detected」または「Swipe Right gesture detected」というToastメッセージが表示されれば、ジェスチャ検出は正常に動作しています。

Androidで左右のスワイプジェスチャを検出・処理する方法

  1. Android版Gmailのスワイプ操作をカスタマイズ・無効化する方法

    これまでAndroidのGmailアプリでは、メールをスワイプすると「削除」か「アーカイブ」のどちらかが実行される仕組みでした。しかし最新のアップデートにより、選択できる操作が大幅に増え、うっかりスワイプしてしまう人にとって嬉しいオプションも加わりました。 スワイプ操作で選べる6つのアクション アーカイブ — 受信トレイからメールを移動する 削除 — メールをゴミ箱フォルダへ移動する 移動 — 別のフォルダ(ラベル)へメールを移動する 既読/未読にする — メールの既読状態を切り替える スヌーズ — メールを一時的に受信トレイから退避させ、後で再表示する なし — 何もアクションを実行しない

  2. Androidでカスタムジェスチャーを追加して操作を時短する方法

    Androidデバイスにカスタムジェスチャーを設定すれば、日々のスマホ操作をぐっと快適にできます。自分が一番使いやすい動きで、新しいタブを開くなどの特定のタスクを実行できるように、端末を自由にカスタマイズできるのが魅力です。 例えば、画面の上端からスワイプするだけで最近使ったアプリへアクセスできたら便利だと思いませんか?カスタムジェスチャーがない状態では、クイック設定パネル( Wi-Fiや歯車アイコンなど)にしかアクセスできません。この記事では、代表的なカスタムジェスチャーアプリを紹介しながら、設定方法をわかりやすく解説します。 All in One Gesturesでカスタムジェスチャーを追