대부분의 휴대폰에 있는 기능이겠지만 현재 내가 사용하는 갤럭시 폰에서는 연락처 또는 전화번호를 오른쪽으로 밀어 전화를 걸거나 왼쪽으로 밀어 메시지를 보낼 수 있는 기능이 있다.
이 기능은 코드를 어떻게 작성해야 하나 고민하고 구글링도 해보다가 사용자의 스와이프 동작을 감지하고 처리하는 OnSwipeListener를 구현해야 한다는 것을 알게 되었다. 비슷하다고 할 수 있는 기능으로는 OnClickListener
가 있다.
setOnClickListener
메서드를 사용하여 해당 뷰에 클릭 리스너를 등록함btn.setOnClickListener {
// 클릭 이벤트 발생 시 수행할 동작
}
View.OnTouchListener
인터페이스를 구현하여 해당 뷰의 터치 이벤트를 감지하고, 제스처에 따른 동작을 구현함class OnSwipeListener(context: Context) : View.OnTouchListener {
// ...
override fun onTouch(view: View, event: MotionEvent): Boolean {
return gestureDetector.onTouchEvent(event)
}
// ...
}
import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
class OnSwipeListener(context: Context) : View.OnTouchListener {
private val gestureDetector = GestureDetector(context, GestureListener())
override fun onTouch(view: View, event: MotionEvent): Boolean {
return gestureDetector.onTouchEvent(event)
}
private inner class GestureListener : 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 {
val diffX = e2.x - e1.x
if (Math.abs(diffX) > SWIPE_THRESHOLD &&
Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD
) {
if (diffX > 0) {
onSwipeRight()
} else {
onSwipeLeft()
}
return true
}
return false
}
}
fun onSwipeRight() {
// 오른쪽으로 스와이프 시 처리할 로직
}
fun onSwipeLeft() {
// 왼쪽으로 스와이프 시 처리할 로직
}
}
View.OnTouchListener
인터페이스를 구현하도록 정의OnTouchListener
로 설정하여 뷰의 터치 이벤트를 감지합니다.gestureDetector
라는 이름으로 GestureDetector 객체 생성GestureListener
클래스는 GestureDetector.SimpleOnGestureListener
를 상속하여 구현됨onFling
메서드는 사용자의 스와이프 동작을 감지하고 그에 따라 로직을 실행하는 핵심 메서드!SWIPE_THRESHOLD
와 SWIPE_VELOCITY_THRESHOLD
는 스와이프 감지에 사용되는 임계값으로, 이 값들을 기반으로 사용자의 스와이프 동작을 판단함onFling
메서드에서는 오른쪽 스와이프와 왼쪽 스와이프를 판단하여 해당하는 로직을 실행함onSwipeRight
메서드는 오른쪽 스와이프 시 실행할 로직을 정의함onSwipeLeft
메서드는 왼쪽 스와이프 시 실행할 로직을 정의!이 클래스를 사용하려면, 스와이프를 감지하고 처리하고자 하는 뷰에 OnTouchListener
로 설정하면 됨
예를 들어, 액티비티나 프래그먼트에서 아래와 같이 사용할 수 있음
val swipeListener = OnSwipeListener(this)
myView.setOnTouchListener(swipeListener)
onSwipeRight
또는 onSwipeLeft
메서드가 호출됨[참고 사이트]
'[Kotlin][Android] 터치 제스처 감지 (Gesture Detector)', 팀노바 & Stickode 개발자 블로그
'[코틀린] Kotlin Swipe 동작 구현하기 (OnSwipeTouchListener)', evolog
'[Android] 화면 터치 중 Swiping을 이용한 View 전환', GIS DEVELOPER