본문 바로가기

android/UI

[ 안드로이드 / Android ] Swipe 제스처 처리하기

반응형

안드로이드에서 스와이프(Swipe) 제스처를 처리하는 방법은 GestureDetector 클래스를 사용하여 구현할 수 있습니다. GestureDetector는 다양한 터치 제스처를 감지할 수 있는 유틸리티 클래스입니다. 여기서는 Java와 Kotlin에서 각각 스와이프 제스처를 처리하는 방법을 예제를 통해 설명하겠습니다.

1. Java를 사용한 스와이프 제스처 처리

예제: GestureDetector를 사용하여 스와이프 처리

 

package com.example.swipehandling;

import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private TextView swipeInfo;
    private GestureDetector gestureDetector;

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

        swipeInfo = findViewById(R.id.swipeInfo);

        gestureDetector = new GestureDetector(this, new SwipeGestureListener());

        // 레이아웃에 터치 리스너를 설정하여 제스처를 감지합니다.
        View layout = findViewById(R.id.layout);
        layout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return gestureDetector.onTouchEvent(event);
            }
        });
    }

    private class SwipeGestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            float diffX = e2.getX() - e1.getX();
            float diffY = e2.getY() - e1.getY();

            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();
                    }
                    return true;
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeDown();
                    } else {
                        onSwipeUp();
                    }
                    return true;
                }
            }
            return false;
        }

        private void onSwipeRight() {
            swipeInfo.setText("Swiped Right");
        }

        private void onSwipeLeft() {
            swipeInfo.setText("Swiped Left");
        }

        private void onSwipeUp() {
            swipeInfo.setText("Swiped Up");
        }

        private void onSwipeDown() {
            swipeInfo.setText("Swiped Down");
        }
    }
}

 

  • 설명:
    • GestureDetectorGestureDetector.SimpleOnGestureListener를 사용하여 스와이프를 처리합니다.
    • 스와이프의 최소 거리와 속도를 설정하여 스와이프를 감지합니다.
    • onFling 메서드에서 스와이프의 방향을 감지하고, 각각의 방향에 대해 처리할 로직을 정의합니다.

2. Kotlin을 사용한 스와이프 제스처 처리

예제: GestureDetector를 사용하여 스와이프 처리

package com.example.swipehandling

import android.os.Bundle
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var swipeInfo: TextView
    private lateinit var gestureDetector: GestureDetector

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        swipeInfo = findViewById(R.id.swipeInfo)

        gestureDetector = GestureDetector(this, SwipeGestureListener())

        val layout: View = findViewById(R.id.layout)
        layout.setOnTouchListener { _, event ->
            gestureDetector.onTouchEvent(event)
            true
        }
    }

    private inner class SwipeGestureListener : GestureDetector.SimpleOnGestureListener() {

        private val SWIPE_THRESHOLD = 100
        private val SWIPE_VELOCITY_THRESHOLD = 100

        override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean {
            if (e1 == null || e2 == null) return false

            val diffX = e2.x - e1.x
            val diffY = e2.y - e1.y

            return 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()
                    }
                    true
                } else {
                    false
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeDown()
                    } else {
                        onSwipeUp()
                    }
                    true
                } else {
                    false
                }
            }
        }

        private fun onSwipeRight() {
            swipeInfo.text = "Swiped Right"
        }

        private fun onSwipeLeft() {
            swipeInfo.text = "Swiped Left"
        }

        private fun onSwipeUp() {
            swipeInfo.text = "Swiped Up"
        }

        private fun onSwipeDown() {
            swipeInfo.text = "Swiped Down"
        }
    }
}
  • 설명:
    • Kotlin에서도 GestureDetectorGestureDetector.SimpleOnGestureListener를 사용하여 스와이프를 처리합니다.
    • onFling 메서드에서 스와이프의 방향을 감지하고, 각각의 방향에 대해 로직을 정의합니다.
    • 레이아웃에 터치 리스너를 설정하여 GestureDetectoronTouchEvent 메서드를 호출합니다.

요약

  • Java와 Kotlin 모두에서: GestureDetector를 사용하여 스와이프 제스처를 감지하고 처리합니다.
  • GestureDetector.SimpleOnGestureListener를 확장하여 스와이프 방향에 대한 로직을 구현합니다.
  • onFling 메서드에서 스와이프의 거리를 계산하고, 방향에 따라 다른 처리를 수행합니다.

이렇게 하면 안드로이드에서 스와이프 제스처를 감지하고 적절하게 처리할 수 있습니다.

반응형

'android > UI' 카테고리의 다른 글

안드로이드 Custom View를 만들고 Key까지 처리하기  (0) 2024.06.04