멜팅비의 개발 공부

[Android-Kotlin] MotionEvent 강제 효과 주기(드래그, 스크롤) 본문

개발 공부/[Android 개발]

[Android-Kotlin] MotionEvent 강제 효과 주기(드래그, 스크롤)

멜팅비 2021. 2. 23. 21:03
반응형

개발 중 버튼을 눌렀을 때 특정 뷰에 강제적으로 스크롤하는 이벤트를 코드로 구현해야 했다.

MotionEvent.obtain()을 통해 터치 이벤트를 수동으로 주면 되는데, 처음에는 스크롤 효과가 아닌 드래그 효과가 되어 많이 고생을 했다.

혹시라도 수동으로 스크롤 효과를 주고 싶은 경우가 있을 때 참고하면 좋을 것 같다.


val downTime = SystemClock.uptimeMillis()
val eventTime = SystemClock.uptimeMillis()
val x = 0.0f
val y = 250.0f
val metaState = 0

val motionEvent1 = MotionEvent.obtain( downTime, eventTime+1000, MotionEvent.ACTION_DOWN, x, y, metaState )
val motionEvent2 = MotionEvent.obtain( downTime+1000, eventTime+2000, MotionEvent.ACTION_MOVE, x, 0f, metaState )
val motionEvent3 = MotionEvent.obtain( downTime+2000, eventTime+2000, MotionEvent.ACTION_UP, x, 0f, metaState )

view.dispatchTouchEvent(motionEvent1)
view.dispatchTouchEvent(motionEvent2)
view.dispatchTouchEvent(motionEvent3)

먼저 수동으로 드래그 효과를 주는 코드이다.

MotionEvent.ACTION_DOWN -> MotionEvent.ACTION_MOVE -> MotionEvent.ACTION_UP 순으로 시간차를 두면서 터치 이벤트를 발생시키는 것으로 자연스럽게 드래그 효과를 줄 수 있다.

 

x, y는 좌표 값을 넣으면 되고, 위 경우는 세로로 드래그하는 경우이다.

 

여기서 스크롤 효과를 주려고 했을 때, MotionEvent.ACTION_MOVE에 y값을 넣어서 해보려고 했지만 똑같이 드래그 효과만 나타났다.

스크롤 효과는 손가락을 화면에서 튕길때 발생하는 효과로 빠르게 튕기고 떼야하기 때문에 시간 값을 수정하게 되었다.

 

val downTime: Long = SystemClock.uptimeMillis()
val eventTime: Long = SystemClock.uptimeMillis()
val metaState = 0

val motionEvent1 = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, 0f, metaState)
val motionEvent2 = MotionEvent.obtain(downTime, eventTime + 5, MotionEvent.ACTION_MOVE, 0f, 200f, metaState)
val motionEvent3 = MotionEvent.obtain(downTime + 10, eventTime + 10, MotionEvent.ACTION_UP, 0f, 100f, metaState)

view.dispatchTouchEvent(motionEvent1)
view.dispatchTouchEvent(motionEvent2)
view.dispatchTouchEvent(motionEvent3)

ACTION_DOWN = 누른다 / ACTION_MOVE = 움직인다 / ACTION_UP = 뗀다

이렇게 생각하고 움직이고 떼는 시간(eventTime)을 빠르게 하여 스크롤 효과를 수동으로 줄 수 있다.

 

dispatchTouchEvent()를 통해 터치 이벤트가 필요한 view에 이벤트를 발생시켰다.

반응형
Comments