1

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
         }
}
Belita Colares
  • 79
  • 1
  • 10

1 Answers1

15

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")
            }
        })
reVerse
  • 35,075
  • 22
  • 89
  • 84
Tung Tran
  • 2,885
  • 2
  • 17
  • 24