Use Compose to animate bottom reader menu bars

(cherry picked from commit 97b4d1f13de194163d7dc13a0d73d023109bc8c2)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
#	app/src/main/res/anim/enter_from_bottom.xml
#	app/src/main/res/anim/exit_to_bottom.xml
This commit is contained in:
arkon 2023-10-09 22:27:46 -04:00 committed by Jobobby04
parent abd97efe85
commit e427dc2d1c
3 changed files with 98 additions and 132 deletions

View File

@ -31,6 +31,10 @@ import android.widget.RelativeLayout
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -311,7 +315,7 @@ class ReaderActivity : BaseActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
viewModel.restartReadTimer() viewModel.restartReadTimer()
setMenuVisibility(viewModel.state.value.menuVisible, animate = false) setMenuVisibility(viewModel.state.value.menuVisible)
} }
/** /**
@ -321,7 +325,7 @@ class ReaderActivity : BaseActivity() {
override fun onWindowFocusChanged(hasFocus: Boolean) { override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus) super.onWindowFocusChanged(hasFocus)
if (hasFocus) { if (hasFocus) {
setMenuVisibility(viewModel.state.value.menuVisible, animate = false) setMenuVisibility(viewModel.state.value.menuVisible)
} }
} }
@ -649,6 +653,17 @@ class ReaderActivity : BaseActivity() {
val readerBottomButtons by readerPreferences.readerBottomButtons().collectAsState() val readerBottomButtons by readerPreferences.readerBottomButtons().collectAsState()
val dualPageSplitPaged by readerPreferences.dualPageSplitPaged().collectAsState() val dualPageSplitPaged by readerPreferences.dualPageSplitPaged().collectAsState()
AnimatedVisibility(
visible = state.menuVisible,
enter = slideInVertically(
initialOffsetY = { it },
animationSpec = tween(200),
),
exit = slideOutVertically(
targetOffsetY = { it },
animationSpec = tween(200),
),
) {
Column( Column(
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
@ -657,18 +672,12 @@ class ReaderActivity : BaseActivity() {
// SY <-- // SY <--
BottomReaderBar( BottomReaderBar(
// SY -->
enabledButtons = readerBottomButtons, enabledButtons = readerBottomButtons,
readingMode = ReadingModeType.fromPreference( // SY <--
viewModel.getMangaReadingMode( readingMode = ReadingModeType.fromPreference(viewModel.getMangaReadingMode(resolveDefault = false)),
resolveDefault = false,
),
),
onClickReadingMode = viewModel::openReadingModeSelectDialog, onClickReadingMode = viewModel::openReadingModeSelectDialog,
orientationMode = OrientationType.fromPreference( orientationMode = OrientationType.fromPreference(viewModel.getMangaOrientationType(resolveDefault = false)),
viewModel.getMangaOrientationType(
resolveDefault = false,
),
),
onClickOrientationMode = viewModel::openOrientationModeSelectDialog, onClickOrientationMode = viewModel::openOrientationModeSelectDialog,
cropEnabled = cropEnabled, cropEnabled = cropEnabled,
onClickCropBorder = { onClickCropBorder = {
@ -713,6 +722,7 @@ class ReaderActivity : BaseActivity() {
) )
} }
} }
}
initDropdownMenu() initDropdownMenu()
// SY <-- // SY <--
@ -942,16 +952,14 @@ class ReaderActivity : BaseActivity() {
// EXH <-- // EXH <--
/** /**
* Sets the visibility of the menu according to [visible] and with an optional parameter to * Sets the visibility of the menu according to [visible].
* [animate] the views.
*/ */
private fun setMenuVisibility(visible: Boolean, animate: Boolean = true) { private fun setMenuVisibility(visible: Boolean) {
viewModel.showMenus(visible) viewModel.showMenus(visible)
if (visible) { if (visible) {
windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
binding.readerMenu.isVisible = true binding.readerMenu.isVisible = true
if (animate) {
val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_top) val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_top)
toolbarAnimation.applySystemAnimatorScale(this) toolbarAnimation.applySystemAnimatorScale(this)
toolbarAnimation.setAnimationListener( toolbarAnimation.setAnimationListener(
@ -965,26 +973,12 @@ class ReaderActivity : BaseActivity() {
// EXH --> // EXH -->
binding.header.startAnimation(toolbarAnimation) binding.header.startAnimation(toolbarAnimation)
// EXH <-- // EXH <--
val vertAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in_side)
val vertAnimationLeft = AnimationUtils.loadAnimation(this, R.anim.fade_in_side_left)
if (readerPreferences.leftVerticalSeekbar().get() && binding.readerNavVert.isVisible) {
binding.seekbarVertContainer.startAnimation(vertAnimationLeft)
} else {
binding.seekbarVertContainer.startAnimation(vertAnimation)
}
val bottomAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_bottom)
bottomAnimation.applySystemAnimatorScale(this)
binding.readerMenuBottom.startAnimation(bottomAnimation)
}
} else { } else {
if (readerPreferences.fullscreen().get()) { if (readerPreferences.fullscreen().get()) {
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars()) windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
} }
if (animate) {
val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_top) val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_top)
toolbarAnimation.applySystemAnimatorScale(this) toolbarAnimation.applySystemAnimatorScale(this)
toolbarAnimation.setAnimationListener( toolbarAnimation.setAnimationListener(
@ -998,18 +992,6 @@ class ReaderActivity : BaseActivity() {
binding.header.startAnimation(toolbarAnimation) binding.header.startAnimation(toolbarAnimation)
// EXH <-- // EXH <--
val vertAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out_side)
val vertAnimationLeft = AnimationUtils.loadAnimation(this, R.anim.fade_out_side_left)
if (readerPreferences.leftVerticalSeekbar().get() && binding.readerNavVert.isVisible) {
binding.seekbarVertContainer.startAnimation(vertAnimationLeft)
} else {
binding.seekbarVertContainer.startAnimation(vertAnimation)
}
val bottomAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_bottom)
bottomAnimation.applySystemAnimatorScale(this)
binding.readerMenuBottom.startAnimation(bottomAnimation)
}
} }
} }

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:duration="200"
android:fromYDelta="100%"
android:toYDelta="0%" />
</set>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:duration="200"
android:fromYDelta="0%"
android:toYDelta="100%" />
</set>