Android一次性搞定View的singleClick doubleClick longClick dropDown dropUp

enum class TouchType {
    SINGLE_CLICK, DOUBLE_CLICK, LONG_CLICK, DROP_DOWN, DROP_UP
}

class SafeMultipleTouchListener : View.OnTouchListener {

    private var downY = 0
    private var firstClick = 0L
    private var secondClick = 0L
    private var actionUp = false
    private var isDoubleClick = false
    private var runBlock: Next<SafeMultipleTouchListener>? = null
    var listener: ((type: TouchType) -> Unit)? = null

    override fun onTouch(v: View, event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                downY = event.rawY.toInt()
                actionUp = false
                isDoubleClick = false
                if (firstClick == 0L && secondClick == 0L) {
                    firstClick = System.currentTimeMillis()
                    runBlock = Next(this).UI(300) {
                        if (actionUp) {
                            if (!isDoubleClick) {
                                executionListener(TouchType.SINGLE_CLICK)
                            }
                        } else {
                            executionListener(TouchType.LONG_CLICK)
                        }
                    }.Run()
                } else {
                    secondClick = System.currentTimeMillis()
                    if (secondClick - firstClick < 300) {
                        runBlock?.Cancel()
                        isDoubleClick = true
                        executionListener(TouchType.DOUBLE_CLICK)
                    }
                }
            }

            MotionEvent.ACTION_MOVE -> {
                val differ = event.rawY.toInt() - downY
                if (differ > 50) {
                    runBlock?.Cancel()
                    executionListener(TouchType.DROP_DOWN)
                } else if (differ < -50) {
                    runBlock?.Cancel()
                    executionListener(TouchType.DROP_UP)
                }
            }

            MotionEvent.ACTION_UP -> actionUp = true
        }
        return true
    }

    private fun executionListener(type: TouchType) {
        Safe { listener?.invoke(type) }
        firstClick = 0L
        secondClick = 0L
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容