Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 오른쪽에서 왼쪽 스와이프 제스처를 처리하는 방법

안드로이드에서 오른쪽에서 왼쪽 스와이프 제스처 처리하기

이 튜토리얼에서는 안드로이드 앱에서 오른쪽에서 왼쪽 방향뿐만 아니라 상하좌우 모든 방향의 스와이프 제스처를 감지하고 처리하는 방법을 단계별로 알아봅니다. 핵심은 GestureDetector를 활용한 커스텀 OnSwipeTouchListener 클래스를 만드는 것입니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File → New Project를 선택한 후, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다.

2단계 — 레이아웃 파일 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android"
   xmlns:app = "https://schemas.android.com/apk/res-auto"
   xmlns:tools = "https://schemas.android.com/tools"
   android:layout_width = "match_parent"
   android:gravity = "center"
   android:layout_height = "match_parent"
   tools:context = ".MainActivity"
   android:orientation = "vertical">
   <Button
      android:id = "@+id/swap"
      android:layout_width = "wrap_content"
      android:layout_height = "wrap_content"
      android:layout_alignParentTop = "true"
      android:layout_centerHorizontal = "true"
      android:layout_marginTop = "27dp"
      android:text = "Swap here"/>
</LinearLayout>

위 코드에서는 스와이프 이벤트를 받을 대상으로 버튼 뷰 하나를 배치했습니다.

3단계 — MainActivity 작성

src/MainActivity.java 파일에 아래 코드를 추가합니다.

package com.example.myapplication;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
   private WindowManager windowManager;
   private ImageView chatHead;
   WindowManager.LayoutParams params;
   @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      findViewById(R.id.swap).setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {
         public void onSwipeTop() {
            Toast.makeText(MainActivity.this, "top", Toast.LENGTH_SHORT).show();
         }
         public void onSwipeRight() {
            Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
         }
         public void onSwipeLeft() {
            Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
         }
         public void onSwipeBottom() {
            Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show();
         }
      });
   }
}

여기서는 버튼에 OnSwipeTouchListener를 설정하고, 네 방향(위·오른쪽·왼쪽·아래)의 스와이프가 감지될 때마다 각각 다른 토스트 메시지를 표시하도록 했습니다.

4단계 — OnSwipeTouchListener 클래스 작성

src/OnSwipeTouchListener.java 파일을 새로 생성하고 아래 코드를 추가합니다.

package com.example.myapplication;
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class OnSwipeTouchListener implements OnTouchListener {
   private final GestureDetector gestureDetector;
   public OnSwipeTouchListener (Context ctx){
      gestureDetector = new GestureDetector(ctx, new GestureListener());
   }
   @Override
   public boolean onTouch(View v, MotionEvent event) {
      return gestureDetector.onTouchEvent(event);
   }
   private final class GestureListener extends 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 onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
         boolean result = false;
         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();
                  }
                  result = true;
               }
            }
            else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
               if (diffY > 0) {
                  onSwipeBottom();
               } else {
                  onSwipeTop();
               }
               result = true;
            }
         } catch (Exception exception) {
            exception.printStackTrace();
         }
         return result;
      }
   }
   public void onSwipeRight() {
   }
   public void onSwipeLeft() {
   }
   public void onSwipeTop() {
   }
   public void onSwipeBottom() {
   }
}

이 클래스의 동작 원리를 살펴보면 다음과 같습니다.

SWIPE_THRESHOLD(100)는 최소 스와이프 거리를, SWIPE_VELOCITY_THRESHOLD(100)는 최소 스와이프 속도를 의미합니다. 두 값 중 하나라도 기준에 미치지 못하면 일반적인 터치로 간주되어 스와이프로 인식되지 않습니다. onFling() 메서드에서는 X축 이동량과 Y축 이동량을 비교해 주 스와이프 방향을 판별한 뒤, 값의 부호에 따라 네 방향 콜백 메서드 중 하나를 호출합니다.

5단계 — 앱 실행 및 결과 확인

앱을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 실행 옵션에서 자신의 모바일 기기를 선택합니다. 그러면 기기에 기본 화면이 표시됩니다.

안드로이드에서 오른쪽에서 왼쪽 스와이프 제스처를 처리하는 방법

이제 아래 그림처럼 버튼 위에서 스와이프해 보세요.

안드로이드에서 오른쪽에서 왼쪽 스와이프 제스처를 처리하는 방법


 안드로이드에서 오른쪽에서 왼쪽 스와이프 제스처를 처리하는 방법