美文网首页
Android一次性搞定View的singleClick dou

Android一次性搞定View的singleClick dou

作者: 猪爸爸Hulk | 来源:发表于2019-03-28 14:52 被阅读0次
    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
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Android一次性搞定View的singleClick dou

          本文链接:https://www.haomeiwen.com/subject/dkuqbqtx.html