화면 터치가 가능한 모바일 단말기에서 터치를 통한 UI의 조작은 매우 효과적입니다. 이러한 터치 기반의 UI의 활용에 대해 자연스러운 사용은 사용자에게 프로그램의 친밀도를 높여줍니다. 화면 터치에 대한 조작 중 Swiping은 사용자가 화면을 스치듯이 상하좌우로 쓸어넘기는 행위입니다. 이러한 Swiping 중 좌우에 대한 이벤트를 처리하기 위한 클래스는 다음과 같습니다.
package geoservice.nexgen import android.content.Context import android.view.GestureDetector import android.view.MotionEvent import android.view.View abstract class OnSwipeTouchListener(context: Context?) : View.OnTouchListener { companion object { private const val SWIPE_DISTANCE_THRESHOLD = 100 private const val SWIPE_VELOCITY_THRESHOLD = 100 } private val gestureDetector: GestureDetector abstract fun onSwipeLeft() abstract fun onSwipeRight() override fun onTouch(v: View?, event: MotionEvent?): Boolean { return gestureDetector.onTouchEvent(event) } private inner class GestureListener : GestureDetector.SimpleOnGestureListener() { override fun onDown(e: MotionEvent): Boolean { return true } override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { val distanceX = e2.x - e1.x val distanceY = e2.y - e1.y if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (distanceX > 0) onSwipeRight() else onSwipeLeft() return true } return false } } init { gestureDetector = GestureDetector(context, GestureListener()) } }
위 클래스를 실제 View에 적용하는 코드의 예는 다음과 같습니다.
llListScroll.setOnTouchListener(object: OnSwipeTouchListener(context) { override fun onSwipeLeft() { btnNext.performClick() } override fun onSwipeRight() { btnPrevious.performClick() } })
실제 위의 코드는 모바일 기반의 GIS 솔루션인 Mobile NexGen에 반영된 코드인데요. 위의 코드와 연관된 기능에 대한 시연 영상은 아래와 같습니다.