Search code examples
androidkotlinkotlin-android-extensionskotlin-extension

capture events by sliding left or right using kotlin


How can I capture events by sliding left or right using kotlin?

I've implemented OnTouchListener to try to capture something, but nothing happens.

class MyClass : Fragment(), View.OnTouchListener {

        lateinit var mRootView: View

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                      savedInstanceState: Bundle?): View? {


                mRootView = inflater.inflate(myLayout, container, false)

                mRootView.setOnTouchListener(this)

                return mRootView
            }

        override fun onTouch(view: View?, event: MotionEvent?): Boolean {
                println("test")
                println(event?.actionMasked.toString())
                return true
         }
}

Solution

  • If want do this, try to custom touch listener implement OnTouchListener

    open class OnSwipeTouchListener : View.OnTouchListener {
    
        private val gestureDetector = GestureDetector(GestureListener())
    
        fun onTouch(event: MotionEvent): Boolean {
            return gestureDetector.onTouchEvent(event)
        }
    
        private inner class GestureListener : GestureDetector.SimpleOnGestureListener() {
    
            private val SWIPE_THRESHOLD = 100
            private val SWIPE_VELOCITY_THRESHOLD = 100
    
            override fun onDown(e: MotionEvent): Boolean {
                return true
            }
    
            override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
                onTouch(e)
                return true
            }
    
    
            override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
                val 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()
                            }
                        }
                    } else {
                        // onTouch(e);
                    }
                } catch (exception: Exception) {
                    exception.printStackTrace()
                }
    
                return result
            }
        }
    
        override fun onTouch(v: View, event: MotionEvent): Boolean {
            return gestureDetector.onTouchEvent(event)
        }
    
        open fun onSwipeRight() {}
    
        open fun onSwipeLeft() {}
    
        open fun onSwipeTop() {}
    
        open fun onSwipeBottom() {}
    }
    

    And usage for view:

    imageView.setOnTouchListener(object : OnSwipeTouchListener() {
                override fun onSwipeLeft() {
                    Log.e("ViewSwipe", "Left")
                }
    
                override fun onSwipeRight() {
                    Log.e("ViewSwipe", "Right")
                }
            })