diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b8261310b..fb16c29d8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -166,9 +166,6 @@
-
: BaseFragment() {
"Adapter was not created or already destroyed"
}
+ protected fun isAnimationEnabled(): Boolean {
+ return context?.isAnimationsEnabled == true && viewModel.pageAnimation.value != ReaderAnimation.NONE
+ }
+
override fun onWindowInsetsChanged(insets: Insets) = Unit
abstract fun switchPageBy(delta: Int)
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt
index beed525cd..73a7f1107 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt
@@ -11,8 +11,8 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.yield
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.os.NetworkState
+import org.koitharu.kotatsu.core.prefs.ReaderAnimation
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
-import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.recyclerView
import org.koitharu.kotatsu.core.util.ext.resetTransformations
@@ -22,6 +22,7 @@ import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter
import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment
import org.koitharu.kotatsu.reader.ui.pager.ReaderPage
+import org.koitharu.kotatsu.reader.ui.pager.standard.NoAnimPageTransformer
import org.koitharu.kotatsu.reader.ui.pager.standard.PagerReaderFragment
import javax.inject.Inject
import kotlin.math.absoluteValue
@@ -48,8 +49,12 @@ class ReversedReaderFragment : BaseReaderFragment
doOnPageChanged(::notifyPageChanged)
}
- viewModel.readerAnimation.observe(viewLifecycleOwner) {
- val transformer = if (it) ReversedPageAnimTransformer() else null
+ viewModel.pageAnimation.observe(viewLifecycleOwner) {
+ val transformer = when (it) {
+ ReaderAnimation.NONE -> NoAnimPageTransformer()
+ ReaderAnimation.DEFAULT -> null
+ ReaderAnimation.ADVANCED -> ReversedPageAnimTransformer()
+ }
binding.pager.setPageTransformer(transformer)
if (transformer == null) {
binding.pager.recyclerView?.children?.forEach { v ->
@@ -74,7 +79,7 @@ class ReversedReaderFragment : BaseReaderFragment
override fun switchPageBy(delta: Int) {
with(requireViewBinding().pager) {
- setCurrentItem(currentItem - delta, context.isAnimationsEnabled)
+ setCurrentItem(currentItem - delta, isAnimationEnabled())
}
}
@@ -82,7 +87,7 @@ class ReversedReaderFragment : BaseReaderFragment
with(requireViewBinding().pager) {
setCurrentItem(
reversed(position),
- smooth && context.isAnimationsEnabled && (currentItem - position).absoluteValue < PagerReaderFragment.SMOOTH_SCROLL_LIMIT,
+ smooth && isAnimationEnabled() && (currentItem - position).absoluteValue < PagerReaderFragment.SMOOTH_SCROLL_LIMIT,
)
}
}
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt
new file mode 100644
index 000000000..2ce4317a1
--- /dev/null
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt
@@ -0,0 +1,15 @@
+package org.koitharu.kotatsu.reader.ui.pager.standard
+
+import android.view.View
+import androidx.viewpager2.widget.ViewPager2
+
+class NoAnimPageTransformer : ViewPager2.PageTransformer {
+
+ override fun transformPage(page: View, position: Float) {
+ page.translationX = when {
+ position in -0.5f..0.5f -> -position * page.width.toFloat()
+ position > 0 -> page.width.toFloat()
+ else -> -page.width.toFloat()
+ }
+ }
+}
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt
index a9c656113..5d5c7f6a5 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt
@@ -11,8 +11,8 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.yield
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.os.NetworkState
+import org.koitharu.kotatsu.core.prefs.ReaderAnimation
import org.koitharu.kotatsu.core.util.ext.doOnPageChanged
-import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.recyclerView
import org.koitharu.kotatsu.core.util.ext.resetTransformations
@@ -47,8 +47,12 @@ class PagerReaderFragment : BaseReaderFragment()
doOnPageChanged(::notifyPageChanged)
}
- viewModel.readerAnimation.observe(viewLifecycleOwner) {
- val transformer = if (it) PageAnimTransformer() else null
+ viewModel.pageAnimation.observe(viewLifecycleOwner) {
+ val transformer = when (it) {
+ ReaderAnimation.NONE -> NoAnimPageTransformer()
+ ReaderAnimation.DEFAULT -> null
+ ReaderAnimation.ADVANCED -> PageAnimTransformer()
+ }
binding.pager.setPageTransformer(transformer)
if (transformer == null) {
binding.pager.recyclerView?.children?.forEach { view ->
@@ -95,7 +99,7 @@ class PagerReaderFragment : BaseReaderFragment()
override fun switchPageBy(delta: Int) {
with(requireViewBinding().pager) {
- setCurrentItem(currentItem + delta, context.isAnimationsEnabled)
+ setCurrentItem(currentItem + delta, isAnimationEnabled())
}
}
@@ -103,7 +107,7 @@ class PagerReaderFragment : BaseReaderFragment()
with(requireViewBinding().pager) {
setCurrentItem(
position,
- smooth && context.isAnimationsEnabled && (currentItem - position).absoluteValue < SMOOTH_SCROLL_LIMIT,
+ smooth && isAnimationEnabled() && (currentItem - position).absoluteValue < SMOOTH_SCROLL_LIMIT,
)
}
}
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt
index 78836411a..789f3cc02 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt
@@ -13,7 +13,6 @@ import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.os.NetworkState
import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition
import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition
-import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding
import org.koitharu.kotatsu.reader.domain.PageLoader
@@ -111,7 +110,7 @@ class WebtoonReaderFragment : BaseReaderFragment()
override fun switchPageBy(delta: Int) {
with(requireViewBinding().recyclerView) {
- if (context.isAnimationsEnabled) {
+ if (isAnimationEnabled()) {
smoothScrollBy(0, (height * 0.9).toInt() * delta, scrollInterpolator)
} else {
nestedScrollBy(0, (height * 0.9).toInt() * delta)
diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt
index fe59043eb..a605cb80f 100644
--- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt
+++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt
@@ -10,6 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.ZoomMode
import org.koitharu.kotatsu.core.prefs.AppSettings
+import org.koitharu.kotatsu.core.prefs.ReaderAnimation
import org.koitharu.kotatsu.core.prefs.ReaderBackground
import org.koitharu.kotatsu.core.prefs.ReaderMode
import org.koitharu.kotatsu.core.ui.BasePreferenceFragment
@@ -32,6 +33,10 @@ class ReaderSettingsFragment :
entryValues = ReaderBackground.entries.names()
setDefaultValueCompat(ReaderBackground.DEFAULT.name)
}
+ findPreference(AppSettings.KEY_READER_ANIMATION)?.run {
+ entryValues = ReaderAnimation.entries.names()
+ setDefaultValueCompat(ReaderAnimation.DEFAULT.name)
+ }
findPreference(AppSettings.KEY_READER_SWITCHERS)?.run {
summaryProvider = MultiSummaryProvider(R.string.gestures_only)
}
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 0b8af4d99..9969d64b1 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -65,4 +65,10 @@
- @string/color_white
- @string/color_black
+
+ - @string/disabled
+ - @string/system_default
+ - @string/advanced
+
+ Advanced
diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml
index 9cb6dc6c4..e8cddffa9 100644
--- a/app/src/main/res/xml/pref_reader.xml
+++ b/app/src/main/res/xml/pref_reader.xml
@@ -42,6 +42,12 @@
android:summary="@string/reader_control_ltr_summary"
android:title="@string/reader_control_ltr" />
+
+