Fix reader animation changes

This commit is contained in:
Koitharu
2020-12-18 07:08:18 +02:00
parent c132f1d5c4
commit 72bedfd92e
8 changed files with 39 additions and 15 deletions

View File

@@ -31,5 +31,5 @@ abstract class BasePageHolder<B : ViewBinding>(
protected abstract fun onBind(data: ReaderPage)
protected open fun onRecycled() = Unit
open fun onRecycled() = Unit
}

View File

@@ -6,6 +6,7 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.reader.ui.PageLoader
import org.koitharu.kotatsu.utils.ext.resetTransformations
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
@@ -24,6 +25,12 @@ abstract class BaseReaderAdapter<H : BasePageHolder<*>>(
holder.bind(differ.currentList[position])
}
override fun onViewRecycled(holder: H) {
holder.onRecycled()
holder.itemView.resetTransformations()
super.onViewRecycled(holder)
}
open fun getItem(position: Int): ReaderPage = differ.currentList[position]
open fun getItemOrNull(position: Int) = differ.currentList.getOrNull(position)

View File

@@ -17,8 +17,7 @@ class PageHolderDelegate(
private val loader: PageLoader,
private val settings: AppSettings,
private val callback: Callback
) : SubsamplingScaleImageView.DefaultOnImageEventListener(),
CoroutineScope by loader {
) : SubsamplingScaleImageView.DefaultOnImageEventListener(), CoroutineScope by loader {
private var state = State.EMPTY
private var job: Job? = null

View File

@@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import kotlinx.coroutines.async
import org.koin.android.ext.android.get
import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding
@@ -11,10 +12,7 @@ import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.pager.BaseReader
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
import org.koitharu.kotatsu.reader.ui.pager.ReaderPage
import org.koitharu.kotatsu.utils.ext.callOnPageChaneListeners
import org.koitharu.kotatsu.utils.ext.doOnPageChanged
import org.koitharu.kotatsu.utils.ext.swapAdapter
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
import org.koitharu.kotatsu.utils.ext.*
class ReversedReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
@@ -30,13 +28,18 @@ class ReversedReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
pagerAdapter = ReversedPagesAdapter(loader, get())
with(binding.pager) {
adapter = pagerAdapter
offscreenPageLimit = 2
offscreenPageLimit = 1
doOnPageChanged(::notifyPageChanged)
}
viewModel.readerAnimation.observe(viewLifecycleOwner) {
val transformer = if (it) ReversedPageAnimTransformer() else null
binding.pager.setPageTransformer(transformer)
if (transformer == null) {
binding.pager.recyclerView?.children?.forEach {
it.resetTransformations()
}
}
}
viewModel.onZoomChanged.observe(viewLifecycleOwner) {
pagerAdapter = ReversedPagesAdapter(loader, get())

View File

@@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import kotlinx.coroutines.async
import org.koin.android.ext.android.get
import org.koitharu.kotatsu.databinding.FragmentReaderStandardBinding
@@ -11,10 +12,7 @@ import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.pager.BaseReader
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
import org.koitharu.kotatsu.reader.ui.pager.ReaderPage
import org.koitharu.kotatsu.utils.ext.callOnPageChaneListeners
import org.koitharu.kotatsu.utils.ext.doOnPageChanged
import org.koitharu.kotatsu.utils.ext.swapAdapter
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
import org.koitharu.kotatsu.utils.ext.*
class PagerReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
@@ -30,13 +28,18 @@ class PagerReaderFragment : BaseReader<FragmentReaderStandardBinding>() {
pagesAdapter = PagesAdapter(loader, get())
with(binding.pager) {
adapter = pagesAdapter
offscreenPageLimit = 2
offscreenPageLimit = 1
doOnPageChanged(::notifyPageChanged)
}
viewModel.readerAnimation.observe(viewLifecycleOwner) {
val transformer = if (it) PageAnimTransformer() else null
binding.pager.setPageTransformer(transformer)
if (transformer == null) {
binding.pager.recyclerView?.children?.forEach {
it.resetTransformations()
}
}
}
viewModel.onZoomChanged.observe(viewLifecycleOwner) {
pagesAdapter = PagesAdapter(loader, get())

View File

@@ -149,6 +149,18 @@ inline fun ViewPager2.doOnPageChanged(crossinline callback: (Int) -> Unit) {
})
}
val ViewPager2.recyclerView: RecyclerView?
get() = children.find { it is RecyclerView } as? RecyclerView
fun View.resetTransformations() {
alpha = 1f
translationX = 0f
translationY = 0f
translationZ = 0f
scaleX = 1f
scaleY = 1f
}
inline fun RecyclerView.doOnCurrentItemChanged(crossinline callback: (Int) -> Unit) {
addOnScrollListener(object : RecyclerView.OnScrollListener() {

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="grid_spacing">8dp</dimen>
<dimen name="grid_spacing">7dp</dimen>
<dimen name="preferred_grid_width">140dp</dimen>
</resources>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="grid_spacing">6dp</dimen>
<dimen name="grid_spacing">5dp</dimen>
<dimen name="manga_list_item_height">84dp</dimen>
<dimen name="manga_list_details_item_height">120dp</dimen>
<dimen name="chapter_list_item_height">46dp</dimen>