티스토리 뷰

반응형
SMALL

스크롤 되는 layout 에서 터치 이벤트를 내가 원하는 동작으로 캐치 하기 위한 방법이라고 생각한다.

 

https://developer.android.com/training/gestures/detector?hl=ko

 

일반 동작 인식  |  Android 개발자  |  Android Developers

일반 동작 인식 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. '터치 동작'은 사용자가 터치스크린에 손가락을 한 개 이상 올려놓을 때 발생하며, 애플리케

developer.android.com

 

 

RecyclerView

open class GestureRecyclerView @JvmOverloads constructor (
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): RecyclerView(context, attrs, defStyleAttr) {

    var detector: GestureDetector? = null

    override fun onTouchEvent(ev: MotionEvent): Boolean {
        return if (detector?.onTouchEvent(ev) == true) true else super.onTouchEvent(ev)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        return if (detector?.onTouchEvent(ev) == true) true else super.onInterceptTouchEvent(ev)
    }
}

해당 class 를 단독 사용하거나 여러 곳에서 나눠 써야 할 수 있기 때문에 open class 로 되어 있는데 단순 class 로 선언해도 상관 없다.

 

 

ScrollView

class GestureScrollView@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : NestedScrollView(context, attrs, defStyleAttr) {

    private var detector: GestureDetector? = null

    fun setGestureDetector(detector: GestureDetector) {
        this.detector = detector
    }

    override fun onTouchEvent(ev: MotionEvent): Boolean {
        return if (detector?.onTouchEvent(ev) == true) true else super.onTouchEvent(ev)
    }
}

 

반응형

 

여기서 사용하고자 하는 class 에서 GestureDetector 를 선언해 사용 하는 함수형으로 만들어 전달 하면 된다.

private val gestureDetector: GestureDetector by lazy {
        GestureDetector(requireContext(), object : GestureDetector.OnGestureListener {
            override fun onDown(p0: MotionEvent?): Boolean {
                return false
            }

            override fun onShowPress(p0: MotionEvent?) {}
            override fun onSingleTapUp(p0: MotionEvent?): Boolean {
                return false
            }

            override fun onScroll(
                p0: MotionEvent?,
                p1: MotionEvent?,
                p2: Float,
                p3: Float
            ): Boolean {
                return false
            }

            override fun onLongPress(p0: MotionEvent?) {}

            override fun onFling(
                p0: MotionEvent?,
                p1: MotionEvent?,
                p2: Float,
                p3: Float
            ): Boolean = false
        })
    }

return 값 처리

 

onTouch > onClick > onLongClick

true : 전달 하지 않음.

false : 다음 이벤트로 전달

반응형
LIST

'Android > RecyclerView' 카테고리의 다른 글

[ RecyclerView #1 ] ItemMoveToSwipe ( ItemTouchHelper )  (0) 2018.12.20
댓글