Prevent scrolling outside bounds in webtoon/vertical reading mode (#8821)
This commit is contained in:
parent
6fe650319d
commit
992bab4f79
1 changed files with 14 additions and 13 deletions
|
@ -106,7 +106,8 @@ class WebtoonRecyclerView @JvmOverloads constructor(
|
||||||
|
|
||||||
val scaleAnimator = ValueAnimator.ofFloat(fromRate, toRate)
|
val scaleAnimator = ValueAnimator.ofFloat(fromRate, toRate)
|
||||||
scaleAnimator.addUpdateListener { animation ->
|
scaleAnimator.addUpdateListener { animation ->
|
||||||
setScaleRate(animation.animatedValue as Float)
|
currentScale = animation.animatedValue as Float
|
||||||
|
setScaleRate(currentScale)
|
||||||
}
|
}
|
||||||
animatorSet.playTogether(translationXAnimator, translationYAnimator, scaleAnimator)
|
animatorSet.playTogether(translationXAnimator, translationYAnimator, scaleAnimator)
|
||||||
animatorSet.duration = ANIMATOR_DURATION_TIME.toLong()
|
animatorSet.duration = ANIMATOR_DURATION_TIME.toLong()
|
||||||
|
@ -122,26 +123,26 @@ class WebtoonRecyclerView @JvmOverloads constructor(
|
||||||
if (currentScale <= 1f) return false
|
if (currentScale <= 1f) return false
|
||||||
|
|
||||||
val distanceTimeFactor = 0.4f
|
val distanceTimeFactor = 0.4f
|
||||||
var newX: Float? = null
|
val animatorSet = AnimatorSet()
|
||||||
var newY: Float? = null
|
|
||||||
|
|
||||||
if (velocityX != 0) {
|
if (velocityX != 0) {
|
||||||
val dx = (distanceTimeFactor * velocityX / 2)
|
val dx = (distanceTimeFactor * velocityX / 2)
|
||||||
newX = getPositionX(x + dx)
|
val newX = getPositionX(x + dx)
|
||||||
|
val translationXAnimator = ValueAnimator.ofFloat(x, newX)
|
||||||
|
translationXAnimator.addUpdateListener { animation -> x = getPositionX(animation.animatedValue as Float) }
|
||||||
|
animatorSet.play(translationXAnimator)
|
||||||
}
|
}
|
||||||
if (velocityY != 0 && (atFirstPosition || atLastPosition)) {
|
if (velocityY != 0 && (atFirstPosition || atLastPosition)) {
|
||||||
val dy = (distanceTimeFactor * velocityY / 2)
|
val dy = (distanceTimeFactor * velocityY / 2)
|
||||||
newY = getPositionY(y + dy)
|
val newY = getPositionY(y + dy)
|
||||||
|
val translationYAnimator = ValueAnimator.ofFloat(y, newY)
|
||||||
|
translationYAnimator.addUpdateListener { animation -> y = getPositionY(animation.animatedValue as Float) }
|
||||||
|
animatorSet.play(translationYAnimator)
|
||||||
}
|
}
|
||||||
|
|
||||||
animate()
|
animatorSet.duration = 400
|
||||||
.apply {
|
animatorSet.interpolator = DecelerateInterpolator()
|
||||||
newX?.let { x(it) }
|
animatorSet.start()
|
||||||
newY?.let { y(it) }
|
|
||||||
}
|
|
||||||
.setInterpolator(DecelerateInterpolator())
|
|
||||||
.setDuration(400)
|
|
||||||
.start()
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue