У меня есть представление изображения, скажем, размером 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. А для скоростной части это значение может быть действительно большим или маленьким. И теперь я немного растерялся из-за того, как его использовать. Если у вас есть предложения, дайте мне знать, как мне это сделать?