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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <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_item_height">84dp</dimen>
<dimen name="manga_list_details_item_height">120dp</dimen> <dimen name="manga_list_details_item_height">120dp</dimen>
<dimen name="chapter_list_item_height">46dp</dimen> <dimen name="chapter_list_item_height">46dp</dimen>