From 992bab4f7956740bafd8227b29958acebfaae64d Mon Sep 17 00:00:00 2001 From: Verzaukeks Date: Sun, 15 Jan 2023 00:38:52 +0100 Subject: [PATCH] Prevent scrolling outside bounds in webtoon/vertical reading mode (#8821) --- .../viewer/webtoon/WebtoonRecyclerView.kt | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt index aba636161..7a3b96676 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt @@ -106,7 +106,8 @@ class WebtoonRecyclerView @JvmOverloads constructor( val scaleAnimator = ValueAnimator.ofFloat(fromRate, toRate) scaleAnimator.addUpdateListener { animation -> - setScaleRate(animation.animatedValue as Float) + currentScale = animation.animatedValue as Float + setScaleRate(currentScale) } animatorSet.playTogether(translationXAnimator, translationYAnimator, scaleAnimator) animatorSet.duration = ANIMATOR_DURATION_TIME.toLong() @@ -122,26 +123,26 @@ class WebtoonRecyclerView @JvmOverloads constructor( if (currentScale <= 1f) return false val distanceTimeFactor = 0.4f - var newX: Float? = null - var newY: Float? = null + val animatorSet = AnimatorSet() if (velocityX != 0) { 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)) { 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() - .apply { - newX?.let { x(it) } - newY?.let { y(it) } - } - .setInterpolator(DecelerateInterpolator()) - .setDuration(400) - .start() + animatorSet.duration = 400 + animatorSet.interpolator = DecelerateInterpolator() + animatorSet.start() return true }