Прокрутка скорости с помощью детектора жестов - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть представление изображения, скажем, размером 100 * 200, и я добавляю изображение размером 100 * 500. Это означает, что мое изображение должно прокручиваться, чтобы увидеть весь контент, но размер представления изображения постоянен. Для начала я попытался использовать сенсорное событие, чтобы прокрутить изображение.

img!!.setOnTouchListener(object : View.OnTouchListener {

        var lastX : Int = imgViewWidth!! / 2
        var lastY : Int = imgViewHeight!! / 2

        var lastTouchX : Int = 0
        var lastTouchY : Int = 0

        override fun onTouch(v: View, m: MotionEvent): Boolean {
            var diffY = 0
            when (m.action) {
                MotionEvent.ACTION_DOWN -> {
                    lastTouchY = m.y.toInt()
                    lastTouchX = m.x.toInt()
                }
                MotionEvent.ACTION_MOVE -> {
                    var diff = (m.y.toInt() - lastTouchY)
                    lastTouchY = m.y.toInt()
                    if (diff > 0 && lastY > minScrollY!!) {
                        if (abs(diff) > abs((lastY - minScrollY!!))) {
                            diff = abs((lastY - minScrollY!!))
                        }
                        diffY = diff
                        lastY -= diff

                    } else if (diff < 0 && lastY < maxScrollY!!) {
                        if (abs(diff) > abs((lastY - maxScrollY!!))) {
                            diff = abs((lastY - maxScrollY!!)) * -1
                        }
                        diffY = diff
                        lastY -= diff
                    }
                }
                MotionEvent.ACTION_UP -> {}
            }
            v.scrollBy(0, diffY * -1)
            return true
        }
    })

Существует некоторая переменная, например minScrollY maxScrollY, которую я рассчитал заранее. Эта реализация прокрутки работает превосходно.

Но с точки зрения пользовательского опыта это медленно, потому что, пока пользователь прокручивает, контент будет прокручивать только столько. Что я ищу, так это когда пользователь убирает палец с экрана после прокрутки, исходя из скорости прокрутки, контент должен прокручиваться немного дольше, а затем останавливаться. Я нашел решение, которое он нашел, используя GestureDetector, так как он имеет метод onFling, и официальный документ также предлагает использовать это для моего варианта использования.

 override fun onTouch(v: View, m: MotionEvent): Boolean {

            if (gd!!.onTouchEvent(m)) {
                return false
            }
            return true
        }

Я сделал это в своем коде и добавлен метод onFling, подобный этому

override fun onFling(p0: MotionEvent?, p1: MotionEvent?, p2: Float, p3: Float): Boolean {
    println("Fling : ${ p0!!.y.toInt() } - ${ p1!!.y.toInt() }, velocity : $p3")
    return true
}

Когда я просматривал журнал, это событие вызывается только один раз, что сильно отличается от запуска событий js. А для скоростной части это значение может быть действительно большим или маленьким. И теперь я немного растерялся из-за того, как его использовать. Если у вас есть предложения, дайте мне знать, как мне это сделать?

...