From e47d494b1cbe104f909669fafdbb1df9d0a3f988 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 10 Mar 2020 18:19:46 +0200 Subject: [PATCH] Fix webtoon scrolling --- .../kotatsu/ui/reader/base/AbstractReader.kt | 9 +++++---- .../ui/reader/base/BaseReaderAdapter.kt | 16 +++++++-------- .../ui/reader/standard/PagerReaderFragment.kt | 2 +- .../ui/reader/standard/PagesAdapter.kt | 4 +--- .../ui/reader/wetoon/WebtoonAdapter.kt | 9 ++------- .../ui/reader/wetoon/WebtoonFrameLayout.kt | 3 --- .../kotatsu/ui/reader/wetoon/WebtoonHolder.kt | 20 +++++++++---------- .../ui/reader/wetoon/WebtoonReaderFragment.kt | 2 +- .../ui/reader/wetoon/WebtoonRecyclerView.kt | 16 --------------- 9 files changed, 27 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt index a976ed3b0..3e9fe9760 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt @@ -11,10 +11,11 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.core.model.MangaState import org.koitharu.kotatsu.domain.MangaProviderFactory import org.koitharu.kotatsu.ui.common.BaseFragment -import org.koitharu.kotatsu.ui.reader.* +import org.koitharu.kotatsu.ui.reader.PageLoader +import org.koitharu.kotatsu.ui.reader.ReaderListener +import org.koitharu.kotatsu.ui.reader.ReaderState abstract class AbstractReader(contentLayoutId: Int) : BaseFragment(contentLayoutId), OnBoundsScrollListener { @@ -23,7 +24,7 @@ abstract class AbstractReader(contentLayoutId: Int) : BaseFragment(contentLayout protected lateinit var loader: PageLoader private set private lateinit var pages: GroupedList - protected var adapter: BaseReaderAdapter<*>? = null + protected var adapter: BaseReaderAdapter? = null private set val hasItems: Boolean @@ -218,7 +219,7 @@ abstract class AbstractReader(contentLayoutId: Int) : BaseFragment(contentLayout protected abstract fun setCurrentItem(position: Int, isSmooth: Boolean) - protected abstract fun onCreateAdapter(dataSet: GroupedList): BaseReaderAdapter<*> + protected abstract fun onCreateAdapter(dataSet: GroupedList): BaseReaderAdapter protected companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt index af3846323..25b2dc03c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt @@ -5,17 +5,17 @@ import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.ui.common.list.BaseViewHolder -abstract class BaseReaderAdapter(private val pages: GroupedList) : - RecyclerView.Adapter>() { +abstract class BaseReaderAdapter(private val pages: GroupedList) : + RecyclerView.Adapter>() { init { @Suppress("LeakingThis") setHasStableIds(true) } - override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val item = pages[position] - holder.bind(item, getExtra(item, position)) + holder.bind(item, Unit) } fun getItem(position: Int) = pages[position] @@ -40,13 +40,11 @@ abstract class BaseReaderAdapter(private val pages: GroupedList { + final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { return onCreateViewHolder(parent).also(this::onViewHolderCreated) } - protected abstract fun getExtra(item: MangaPage, position: Int): E + protected open fun onViewHolderCreated(holder: BaseViewHolder) = Unit - protected open fun onViewHolderCreated(holder: BaseViewHolder) = Unit - - protected abstract fun onCreateViewHolder(parent: ViewGroup): BaseViewHolder + protected abstract fun onCreateViewHolder(parent: ViewGroup): BaseViewHolder } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt index 62b121e0d..88df58917 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagerReaderFragment.kt @@ -30,7 +30,7 @@ class PagerReaderFragment() : AbstractReader(R.layout.fragment_reader_standard) super.onDestroyView() } - override fun onCreateAdapter(dataSet: GroupedList): BaseReaderAdapter<*> { + override fun onCreateAdapter(dataSet: GroupedList): BaseReaderAdapter { return PagesAdapter(dataSet, loader) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagesAdapter.kt index b7158a61e..6793af341 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PagesAdapter.kt @@ -9,9 +9,7 @@ import org.koitharu.kotatsu.ui.reader.PageLoader class PagesAdapter( pages: GroupedList, private val loader: PageLoader -) : BaseReaderAdapter(pages) { +) : BaseReaderAdapter(pages) { override fun onCreateViewHolder(parent: ViewGroup) = PageHolder(parent, loader) - - override fun getExtra(item: MangaPage, position: Int) = Unit } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonAdapter.kt index 368363dec..32ef3ee79 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonAdapter.kt @@ -1,20 +1,15 @@ package org.koitharu.kotatsu.ui.reader.wetoon -import android.view.Gravity import android.view.ViewGroup import org.koitharu.kotatsu.core.model.MangaPage +import org.koitharu.kotatsu.ui.reader.PageLoader import org.koitharu.kotatsu.ui.reader.base.BaseReaderAdapter import org.koitharu.kotatsu.ui.reader.base.GroupedList -import org.koitharu.kotatsu.ui.reader.PageLoader class WebtoonAdapter( pages: GroupedList, private val loader: PageLoader -) : BaseReaderAdapter(pages) { - - var pageGravity: Int = Gravity.TOP +) : BaseReaderAdapter(pages) { override fun onCreateViewHolder(parent: ViewGroup) = WebtoonHolder(parent, loader) - - override fun getExtra(item: MangaPage, position: Int) = pageGravity } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonFrameLayout.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonFrameLayout.kt index 38a20ba83..9668aede0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonFrameLayout.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonFrameLayout.kt @@ -19,9 +19,6 @@ class WebtoonFrameLayout @JvmOverloads constructor( } fun dispatchVerticalScroll(dy: Int): Int { - if (!target.isImageLoaded) { - return dy //consume all scrolling - } target.getPanRemaining(pan) val c = target.center ?: return 0 val s = target.scale diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt index 141b98750..44af0872d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.ui.reader.wetoon import android.graphics.PointF -import android.view.Gravity import android.view.ViewGroup import androidx.core.net.toUri import androidx.core.view.isVisible @@ -17,11 +16,10 @@ import org.koitharu.kotatsu.utils.ext.getDisplayMessage class WebtoonHolder(parent: ViewGroup, private val loader: PageLoader) : - BaseViewHolder(parent, R.layout.item_page_webtoon), + BaseViewHolder(parent, R.layout.item_page_webtoon), SubsamplingScaleImageView.OnImageEventListener, CoroutineScope by loader { private var job: Job? = null - private var yFactor = 0f init { ssiv.setOnImageEventListener(this) @@ -30,12 +28,7 @@ class WebtoonHolder(parent: ViewGroup, private val loader: PageLoader) : } } - override fun onBind(data: MangaPage, extra: Int) { - yFactor = when(extra) { - Gravity.TOP -> 0f - Gravity.BOTTOM -> 1f - else -> 0.5f - } + override fun onBind(data: MangaPage, extra: Unit) { doLoad(data, force = false) } @@ -63,7 +56,14 @@ class WebtoonHolder(parent: ViewGroup, private val loader: PageLoader) : ssiv.minScale = ssiv.width / ssiv.sWidth.toFloat() ssiv.setScaleAndCenter( ssiv.minScale, - PointF(ssiv.sWidth / 2f, ssiv.sHeight * yFactor) + PointF( + ssiv.sWidth / 2f, + if (itemView.top < 0) { + ssiv.sHeight.toFloat() + } else { + 0f + } + ) ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt index 3201eca8b..1551d9b0c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonReaderFragment.kt @@ -31,7 +31,7 @@ class WebtoonReaderFragment : AbstractReader(R.layout.fragment_reader_webtoon) { recyclerView.doOnCurrentItemChanged(::notifyPageChanged) } - override fun onCreateAdapter(dataSet: GroupedList): BaseReaderAdapter<*> { + override fun onCreateAdapter(dataSet: GroupedList): BaseReaderAdapter { return WebtoonAdapter(dataSet, loader) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonRecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonRecyclerView.kt index 644c25804..348108299 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonRecyclerView.kt @@ -12,8 +12,6 @@ class WebtoonRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : RecyclerView(context, attrs, defStyleAttr) { - private var lastScrollDirection = 0 - override fun dispatchNestedPreScroll( dx: Int, dy: Int, @@ -49,18 +47,4 @@ class WebtoonRecyclerView @JvmOverloads constructor( scrollY -= (child as WebtoonFrameLayout).dispatchVerticalScroll(scrollY) return dy - scrollY } - - override fun onScrolled(dx: Int, dy: Int) { - val direction = dy.sign - if (direction != lastScrollDirection) { - (adapter as? WebtoonAdapter)?.let { - it.pageGravity = if (dy < 0) { - Gravity.BOTTOM - } else { - Gravity.TOP - } - lastScrollDirection = direction - } - } - } } \ No newline at end of file