Browse Source

增加进入书籍阅读时动画效果的配置
高级设置:延缓书籍加载、使用共享元素动画

HapeLee 1 year ago
parent
commit
6190704280

+ 1 - 0
app/src/main/java/io/legato/kazusa/constant/PreferKey.kt

@@ -208,6 +208,7 @@ object PreferKey {
     const val paddingDisplayCutouts = "paddingDisplayCutouts"
 
     const val delayBookLoadEnable = "delayBookLoadEnable"
+    const val sharedElementEnterTransitionEnable = "sharedElementEnterTransitionEnable"
 
     const val bookshelfLayoutGridLandscape = "bookshelfLayoutGridLandscape"
 

+ 23 - 6
app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt

@@ -211,18 +211,29 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
             appCtx.putPrefInt(PreferKey.bookGroupStyle, value)
         }
 
-    var bookshelfLayoutPortrait: Int
-        get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutPortrait, 3)
+    var bookshelfLayoutModePortrait: Int
+        get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutModePortrait, 1)
         set(value) {
-            appCtx.putPrefInt(PreferKey.bookshelfLayoutPortrait, value)
+            appCtx.putPrefInt(PreferKey.bookshelfLayoutModePortrait, value)
         }
 
-    var bookshelfLayoutLandscape: Int
-        get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutLandscape, 5)
+    var bookshelfLayoutModeLandscape: Int
+        get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutModeLandscape, 1)
         set(value) {
-            appCtx.putPrefInt(PreferKey.bookshelfLayoutLandscape, value)
+            appCtx.putPrefInt(PreferKey.bookshelfLayoutModeLandscape, value)
         }
 
+    var bookshelfLayoutGridPortrait: Int
+        get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutGridPortrait, 3)
+        set(value) {
+            appCtx.putPrefInt(PreferKey.bookshelfLayoutGridPortrait, value)
+        }
+
+    var bookshelfLayoutGridLandscape: Int
+        get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutGridLandscape, 7)
+        set(value) {
+            appCtx.putPrefInt(PreferKey.bookshelfLayoutGridLandscape, value)
+        }
 
     var saveTabPosition: Int
         get() = appCtx.getPrefInt(PreferKey.saveTabPosition, 0)
@@ -573,6 +584,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
     val paddingDisplayCutouts
         get() = appCtx.getPrefBoolean(PreferKey.paddingDisplayCutouts, false)
 
+    val delayBookLoadEnable
+        get() = appCtx.getPrefBoolean(PreferKey.delayBookLoadEnable, true)
+
+    val sharedElementEnterTransitionEnable
+        get() = appCtx.getPrefBoolean(PreferKey.sharedElementEnterTransitionEnable, true)
+
     var searchScope: String
         get() = appCtx.getPrefString("searchScope") ?: ""
         set(value) {

+ 79 - 40
app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt

@@ -6,6 +6,7 @@ import android.content.Intent
 import android.content.res.Configuration
 import android.graphics.Color
 import android.os.Bundle
+import android.transition.Transition
 import android.view.Gravity
 import android.view.HapticFeedbackConstants
 import android.view.InputDevice
@@ -19,6 +20,7 @@ import androidx.activity.result.contract.ActivityResultContracts
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.widget.PopupMenu
 import androidx.core.net.toUri
+import androidx.core.view.doOnLayout
 import androidx.core.view.doOnPreDraw
 import androidx.core.view.get
 import androidx.core.view.size
@@ -263,59 +265,98 @@ class ReadBookActivity : BaseReadBookActivity(),
 
     @SuppressLint("ClickableViewAccessibility")
     override fun onCreate(savedInstanceState: Bundle?) {
-        postponeEnterTransition()
-        val transform = MaterialContainerTransform().apply {
-            addTarget(binding.rootView)
-            scrimColor = Color.TRANSPARENT
-            duration = 500
-        }
-        window.sharedElementEnterTransition = transform
-        window.sharedElementReturnTransition =
-            MaterialSharedAxis(MaterialSharedAxis.X, true).apply { duration = 300 }
-        super.onCreate(savedInstanceState)
 
-        binding.rootView.transitionName = intent.getStringExtra("transitionName")
-        binding.cursorLeft.setOnTouchListener(this)
-        binding.cursorRight.setOnTouchListener(this)
+        if (AppConfig.sharedElementEnterTransitionEnable) {
+            postponeEnterTransition()
+            val transform = MaterialContainerTransform().apply {
+                addTarget(binding.rootView)
+                scrimColor = Color.TRANSPARENT
+                duration = 500
+            }
+            window.sharedElementEnterTransition = transform
 
-        binding.rootView.doOnPreDraw { startPostponedEnterTransition() }
+            window.sharedElementReturnTransition =
+                MaterialSharedAxis(MaterialSharedAxis.X, true).apply {
+                    duration = 300
+                }
 
-        lifecycleScope.launch(Dispatchers.Default) {
-            viewModel.initReadBookConfig(intent)
-            viewModel.initData(intent)
+            if (AppConfig.delayBookLoadEnable) {
+                window.sharedElementEnterTransition?.addListener(object :
+                    Transition.TransitionListener {
+                    override fun onTransitionStart(transition: Transition) {}
+                    override fun onTransitionEnd(transition: Transition) {
+                        binding.readView.doOnLayout {
+                            viewModel.initReadBookConfig(intent)
+                            viewModel.initData(intent)
+                            binding.readView.initAfterTransition()
+                            justInitData = true
+                        }
+                        transition.removeListener(this)
+                    }
 
-            withContext(Main) {
-                binding.readView.initAfterTransition()
-                justInitData = true
+                    override fun onTransitionCancel(transition: Transition) {
+                        viewModel.initReadBookConfig(intent)
+                        viewModel.initData(intent)
+                        binding.readView.initAfterTransition()
+                        justInitData = true
+                        transition.removeListener(this)
+                    }
+
+                    override fun onTransitionPause(transition: Transition) {}
+                    override fun onTransitionResume(transition: Transition) {}
+                })
             }
         }
 
-        onBackPressedDispatcher.addCallback(this) {
-            when {
-                isShowingSearchResult -> {
-                    exitSearchMenu()
-                    restoreLastBookProcess()
-                }
+        super.onCreate(savedInstanceState)
 
-                ReadBook.lastBookProgress != null && confirmRestoreProcess != false -> {
-                    restoreLastBookProcess()
-                }
+        if (!AppConfig.delayBookLoadEnable || !AppConfig.sharedElementEnterTransitionEnable) {
+            lifecycleScope.launch(Dispatchers.Default) {
+                viewModel.initReadBookConfig(intent)
+                viewModel.initData(intent)
 
-                BaseReadAloudService.isPlay() -> {
-                    ReadAloud.pause(this@ReadBookActivity)
-                    toastOnUi(R.string.read_aloud_pause)
+                withContext(Main) {
+                    binding.readView.initAfterTransition()
+                    justInitData = true
                 }
+            }
+        }
 
-                isAutoPage -> {
-                    autoPageStop()
-                }
 
-                getPrefBoolean("disableReturnKey") && !menuLayoutIsVisible -> {
+        if (AppConfig.sharedElementEnterTransitionEnable)
+            binding.rootView.transitionName = intent.getStringExtra("transitionName")
 
-                }
+        binding.cursorLeft.setOnTouchListener(this)
+        binding.cursorRight.setOnTouchListener(this)
+
+        binding.rootView.doOnPreDraw {
+            startPostponedEnterTransition()
+        }
 
-                else -> finish()
+        onBackPressedDispatcher.addCallback(this) {
+            if (isShowingSearchResult) {
+                exitSearchMenu()
+                restoreLastBookProcess()
+                return@addCallback
+            }
+            //拦截返回供恢复阅读进度
+            if (ReadBook.lastBookProgress != null && confirmRestoreProcess != false) {
+                restoreLastBookProcess()
+                return@addCallback
+            }
+            if (BaseReadAloudService.isPlay()) {
+                ReadAloud.pause(this@ReadBookActivity)
+                toastOnUi(R.string.read_aloud_pause)
+                return@addCallback
+            }
+            if (isAutoPage) {
+                autoPageStop()
+                return@addCallback
             }
+            if (getPrefBoolean("disableReturnKey") && !menuLayoutIsVisible) {
+                return@addCallback
+            }
+            finish()
         }
     }
 
@@ -324,8 +365,6 @@ class ReadBookActivity : BaseReadBookActivity(),
         upScreenTimeOut()
         ReadBook.register(this)
     }
-
-
     override fun onNewIntent(intent: Intent) {
         super.onNewIntent(intent)
         viewModel.initData(intent)

+ 12 - 0
app/src/main/res/xml/pref_config_other.xml

@@ -94,6 +94,18 @@
             android:summary="@string/firebase_enable_summary"
             android:title="@string/firebase_enable_title" />
 
+        <io.legato.kazusa.lib.prefs.SwitchPreference
+            android:defaultValue="true"
+            android:key="sharedElementEnterTransitionEnable"
+            android:summary="从书架进入阅读界面时,优化动画效果。"
+            android:title="使用共享元素动画" />
+
+        <io.legato.kazusa.lib.prefs.SwitchPreference
+            android:defaultValue="true"
+            android:key="delayBookLoadEnable"
+            android:summary="减少进入阅读界面时的卡顿,但加载书籍时间会延长。"
+            android:title="延缓书籍加载" />
+
         <io.legato.kazusa.lib.prefs.Preference
             android:key="localPassword"
             android:summary="@string/set_local_password_summary"