From 50d4c418554b723afe0ae9988646f24f9a63f7db Mon Sep 17 00:00:00 2001 From: ViAnh Date: Wed, 23 Aug 2023 15:25:52 +0700 Subject: [PATCH] Fix webtoon under scale --- .../reader/ui/pager/webtoon/WebtoonFrameLayout.kt | 4 ++-- .../reader/ui/pager/webtoon/WebtoonImageView.kt | 12 ++++++++++++ .../reader/ui/pager/webtoon/WebtoonRecyclerView.kt | 8 ++++++++ .../reader/ui/pager/webtoon/WebtoonScalingFrame.kt | 14 ++++---------- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt index fd1e45290..fe8bcb660 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonFrameLayout.kt @@ -12,7 +12,7 @@ class WebtoonFrameLayout @JvmOverloads constructor( @AttrRes defStyleAttr: Int = 0, ) : FrameLayout(context, attrs, defStyleAttr) { - private val target by lazy(LazyThreadSafetyMode.NONE) { + val target by lazy(LazyThreadSafetyMode.NONE) { findViewById(R.id.ssiv) } @@ -24,4 +24,4 @@ class WebtoonFrameLayout @JvmOverloads constructor( target.scrollBy(dy) return target.getScroll() - oldScroll } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt index 0b6f1df14..22c87c944 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonImageView.kt @@ -88,6 +88,18 @@ class WebtoonImageView @JvmOverloads constructor( setMeasuredDimension(width, height) } + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + if (oldh == h || oldw == 0 || oldh == 0 || scrollRange == SCROLL_UNKNOWN) return + + computeScrollRange() + val container = parents.firstNotNullOfOrNull { it as? WebtoonFrameLayout } ?: return + val parentHeight = parentHeight() + if (scrollPos != 0 && container.bottom < parentHeight) { + scrollTo(scrollRange) + } + } + private fun scrollToInternal(pos: Int) { scrollPos = pos ct.set(sWidth / 2f, (height / 2f + pos.toFloat()) / minScale) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt index 2a0acaee3..ba3a4653e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonRecyclerView.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.reader.ui.pager.webtoon import android.content.Context import android.util.AttributeSet import androidx.core.view.ViewCompat.TYPE_TOUCH +import androidx.core.view.forEach import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition import java.util.LinkedList @@ -13,6 +14,13 @@ class WebtoonRecyclerView @JvmOverloads constructor( private var onPageScrollListeners: MutableList? = null + override fun onMeasure(widthSpec: Int, heightSpec: Int) { + super.onMeasure(widthSpec, heightSpec) + forEach { child -> + (child as WebtoonFrameLayout).target.requestLayout() + } + } + override fun startNestedScroll(axes: Int) = startNestedScroll(axes, TYPE_TOUCH) override fun startNestedScroll(axes: Int, type: Int): Boolean = true diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt index a347ac35c..eb49fe71f 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonScalingFrame.kt @@ -1,6 +1,6 @@ package org.koitharu.kotatsu.reader.ui.pager.webtoon -import android.animation.ObjectAnimator +import android.animation.ValueAnimator import android.content.Context import android.graphics.Matrix import android.graphics.Rect @@ -15,7 +15,7 @@ import android.widget.OverScroller import androidx.core.view.GestureDetectorCompat private const val MAX_SCALE = 2.5f -private const val MIN_SCALE = 1f // under-scaling disabled due to buggy nested scroll +private const val MIN_SCALE = 0.5f class WebtoonScalingFrame @JvmOverloads constructor( context: Context, @@ -40,7 +40,6 @@ class WebtoonScalingFrame @JvmOverloads constructor( private var halfHeight = 0f private val translateBounds = RectF() private val targetHitRect = Rect() - private var pendingScroll = 0 var isZoomEnable = true set(value) { @@ -101,8 +100,6 @@ class WebtoonScalingFrame @JvmOverloads constructor( if (scale < 1) { targetChild.getHitRect(targetHitRect) - targetChild.scrollBy(0, pendingScroll) - pendingScroll = 0 } } @@ -124,7 +121,6 @@ class WebtoonScalingFrame @JvmOverloads constructor( else -> 0f } - pendingScroll = dy.toInt() transformMatrix.postTranslate(dx, dy) syncMatrixValues() } @@ -159,9 +155,7 @@ class WebtoonScalingFrame @JvmOverloads constructor( override fun onScaleBegin(detector: ScaleGestureDetector): Boolean = true - override fun onScaleEnd(p0: ScaleGestureDetector) { - pendingScroll = 0 - } + override fun onScaleEnd(p0: ScaleGestureDetector) = Unit private inner class GestureListener : GestureDetector.SimpleOnGestureListener(), Runnable { @@ -175,7 +169,7 @@ class WebtoonScalingFrame @JvmOverloads constructor( override fun onDoubleTap(e: MotionEvent): Boolean { val newScale = if (scale != 1f) 1f else MAX_SCALE * 0.8f - ObjectAnimator.ofFloat(scale, newScale).run { + ValueAnimator.ofFloat(scale, newScale).run { interpolator = AccelerateDecelerateInterpolator() duration = 300 addUpdateListener {