From e528cc38ae857a57eacbd1af1f0201f551e060a0 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 5 Mar 2020 19:35:06 +0200 Subject: [PATCH] Fix webtoon page gravity --- .../ui/common/list/BaseRecyclerAdapter.kt | 2 +- .../ui/reader/{Action.kt => ReaderAction.kt} | 0 .../ui/reader/wetoon/WebtoonAdapter.kt | 13 ++---------- .../ui/reader/wetoon/WebtoonRecyclerView.kt | 20 ++++++++++++++++++- .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 7 ++++++- 5 files changed, 28 insertions(+), 14 deletions(-) rename app/src/main/java/org/koitharu/kotatsu/ui/reader/{Action.kt => ReaderAction.kt} (100%) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt index b28d08871..1b026e504 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt @@ -10,7 +10,7 @@ abstract class BaseRecyclerAdapter(private val onItemClickListener: OnRecy RecyclerView.Adapter>(), KoinComponent { - protected val dataSet = ArrayList() + protected val dataSet = ArrayList() //TODO make private val items get() = dataSet.toImmutableList() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/Action.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderAction.kt similarity index 100% rename from app/src/main/java/org/koitharu/kotatsu/ui/reader/Action.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderAction.kt 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 c4c23b97d..738fe2031 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 @@ -9,21 +9,12 @@ import org.koitharu.kotatsu.ui.reader.PageLoader class WebtoonAdapter(private val loader: PageLoader) : BaseRecyclerAdapter() { - private var lastBound = -1 + var pageGravity: Int = Gravity.TOP override fun onCreateViewHolder(parent: ViewGroup) = WebtoonHolder(parent, loader) override fun onGetItemId(item: MangaPage) = item.id - override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - super.onBindViewHolder(holder, position) - lastBound = position - } - - override fun getExtra(item: MangaPage, position: Int) = if (position >= lastBound) { - Gravity.TOP - } else { - Gravity.BOTTOM - } + 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/WebtoonRecyclerView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonRecyclerView.kt index 7c2608f77..644c25804 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 @@ -2,14 +2,18 @@ package org.koitharu.kotatsu.ui.reader.wetoon import android.content.Context import android.util.AttributeSet +import android.view.Gravity import android.view.View import androidx.core.view.children import androidx.recyclerview.widget.RecyclerView +import kotlin.math.sign 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, @@ -42,7 +46,21 @@ class WebtoonRecyclerView @JvmOverloads constructor( else -> null } ?: return 0 var scrollY = dy - scrollY -= (child as WebtoonFrameLayout) .dispatchVerticalScroll(scrollY) + 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 diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index b9ed1da96..8c46f13c2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -23,6 +23,7 @@ import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import org.koitharu.kotatsu.ui.common.ChipsFactory +import kotlin.math.roundToInt fun View.hideKeyboard() { val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager @@ -182,7 +183,7 @@ fun RecyclerView.doOnCurrentItemChanged(callback: (Int) -> Unit) { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) val item = (recyclerView.layoutManager as? LinearLayoutManager) - ?.findFirstVisibleItemPosition() + ?.findMiddleVisibleItemPosition() if (item != null && item != RecyclerView.NO_POSITION && item != lastItem) { lastItem = item callback(item) @@ -219,4 +220,8 @@ fun ViewPager2.callOnPageChaneListeners() { } catch (e: Throwable) { Log.e(null, "ViewPager2.callOnPageChaneListeners() failed", e) } +} + +fun LinearLayoutManager.findMiddleVisibleItemPosition(): Int { + return ((findFirstVisibleItemPosition() + findLastVisibleItemPosition()) / 2.0).roundToInt() } \ No newline at end of file