728x90

TicketDialogFragment / OnViewCreated

//Swipe Gesture
        binding.layoutSimpleScrollview.setOnTouchListener(object :
            OnSwipeTouchListener(requireContext()) {
            override fun onSwipeTop() {
                super.onSwipeTop()
                val intent = Intent(context, DetailActivity::class.java).apply {
                    putExtra(Constants.SHOW_ID, ticketId)
                    putExtra(Constants.FACILITY_ID, facilityId)
                }
                startActivity(intent)
                activity?.overridePendingTransition(R.anim.slide_up, R.anim.no_animation)
            }
        })
    }

 

onSwipeTop() 오버라이드해서 onSwipeTop() 호출될때의 코드 작성 

예시에는 DetailActivity를 띄워주는 코드 

 

activity?.overridePendingTransition(R.anim.slide_up, R.anim.no_animation) 

- 액티비티 띄울 때 애니매이션 적용 (아래에서 위로)

 

res/anim/slide_up.xml / res/anim/no_animtaion.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="0%" />
</set>

//no_animation.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

</set>

 

 

OnSwipeTouchListener 

더보기
import android.content.Context
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
//Gesture
open class OnSwipeTouchListener(ctx: Context) : View.OnTouchListener {

    private val gestureDetector: GestureDetector

    companion object {
        private val SWIPE_THRESHOLD = 500 // 스와이프 거리를 늘릴 값
        private val SWIPE_VELOCITY_THRESHOLD = 500 // 스와이프 인식에 필요한 최소 속도를 늘릴 값
    }

    init {
        gestureDetector = GestureDetector(ctx, GestureListener())
    }

    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 {
            var result = false
            try {
                val diffY = e2.y - e1!!.y
                val diffX = e2.x - e1.x
                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
        }

    }

    fun onSwipeRight() {}

    fun onSwipeLeft() {}

    open fun onSwipeTop() {}

    fun onSwipeBottom() {}
    override fun onTouch(v: View?, event: MotionEvent?): Boolean {
        try {
            return gestureDetector.onTouchEvent(event!!)
        } catch (e: Exception) {
            // Error Handling
        }
        return false
    }
}

 

SimpleOnGestureListener

  • 제스처 이벤트를 감지하는 데 사용되는 여러 콜백 메서드를 기본 구현으로 제공

onDown(e: MotionEvent): Boolean

  • 메서드는 모든 제스처 이벤트가 시작될 때 호출 (true를 반환하여 이벤트 시퀀스를 처리)

onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean

  • onFling(스크롤과 비슷하지만 손가락으로 튕길 때)
  • 플링 제스처가 발생했을 때 호출 

 

참고 

https://evolog.tistory.com/7

 

[코틀린] Kotlin Swipe 동작 구현하기 (OnSwipeTouchListener)

개요 Kotlin 코드로 View에 Swipe 동작 구현 코드 정리 입니다. 매번 검색하기 번거로워 정리하려 합니다. 핵심은 OnSwipeTouchListener Class 구현 코드를 정리 입니다. (※ 참고 : https://stackoverflow.com/questions/

evolog.tistory.com

 

+ Recent posts