From 41fc6febe6f652f4db97d166c1358f217e4b3182 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Sun, 31 Aug 2025 02:17:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=8F=E5=B0=8F=E5=8A=A8=E7=94=BB=E5=8D=A1?= =?UTF-8?q?=E9=A1=BF=E6=A6=82=E7=8E=87=EF=BC=88=E4=BD=86=E6=98=AF=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E6=9C=89=E9=99=90=E5=91=9C=E5=91=9C=E5=91=9C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legato/kazusa/model/ReadBook.kt | 2 +- .../kazusa/ui/book/info/BookInfoActivity.kt | 17 ++-- .../ui/book/read/BaseReadBookActivity.kt | 14 +-- .../kazusa/ui/book/read/ReadBookActivity.kt | 97 ++++++++++--------- .../io/legato/kazusa/ui/book/read/ReadMenu.kt | 1 - .../kazusa/ui/book/read/page/ReadView.kt | 12 ++- .../ui/book/read/page/entities/TextChapter.kt | 4 +- .../ui/book/read/page/entities/TextPage.kt | 3 +- 8 files changed, 83 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/io/legato/kazusa/model/ReadBook.kt b/app/src/main/java/io/legato/kazusa/model/ReadBook.kt index 712bfff54..a0309b47c 100644 --- a/app/src/main/java/io/legato/kazusa/model/ReadBook.kt +++ b/app/src/main/java/io/legato/kazusa/model/ReadBook.kt @@ -492,7 +492,7 @@ object ReadBook : CoroutineScope by MainScope() { */ val durPageIndex: Int get() { - return curTextChapter?.getPageIndexByCharIndex(durChapterPos) ?: durChapterPos + return curTextChapter?.getPageIndexByCharIndex(durChapterPos) ?: 0 } /** diff --git a/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt index c744616d5..72c0ac8be 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt @@ -15,6 +15,7 @@ import android.widget.LinearLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.content.ContextCompat +import androidx.core.view.doOnPreDraw import androidx.lifecycle.lifecycleScope import com.google.android.material.transition.platform.MaterialContainerTransform import io.legato.kazusa.R @@ -153,21 +154,19 @@ class BookInfoActivity : @SuppressLint("PrivateResource") override fun onCreate(savedInstanceState: Bundle?) { - window.sharedElementEnterTransition = MaterialContainerTransform().apply { + postponeEnterTransition() + val transform = MaterialContainerTransform().apply { addTarget(binding.ivCover) - duration = 500 scrimColor = Color.TRANSPARENT - fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH - } - window.sharedElementReturnTransition = MaterialContainerTransform().apply { - addTarget(binding.ivCover) - duration = 500 - scrimColor = Color.TRANSPARENT - fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH } + window.sharedElementEnterTransition = transform + window.sharedElementReturnTransition = transform window.sharedElementsUseOverlay = false super.onCreate(savedInstanceState) binding.ivCover.transitionName = intent.getStringExtra("transitionName") + binding.ivCover.doOnPreDraw { + startPostponedEnterTransition() + } setSupportActionBar(binding.topBar) binding.llRead?.applyNavigationBarMargin() binding.btnShelf.text = getString(R.string.remove_from_bookshelf) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/BaseReadBookActivity.kt index b6b41ae77..8df6c6cca 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/BaseReadBookActivity.kt @@ -11,6 +11,7 @@ import android.view.WindowInsets import android.view.WindowManager import androidx.activity.viewModels import androidx.core.view.WindowInsetsCompat +import androidx.core.view.doOnDetach import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import io.legato.kazusa.R @@ -84,14 +85,15 @@ abstract class BaseReadBookActivity : setOrientation() upLayoutInDisplayCutoutMode() super.onCreate(savedInstanceState) - binding.navigationBar.setOnApplyWindowInsetsListenerCompat { view, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) - view.updateLayoutParams { - height = insets.bottom + binding.navigationBar.doOnDetach { + binding.navigationBar.setOnApplyWindowInsetsListenerCompat { view, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.updateLayoutParams { + height = insets.bottom + } + windowInsets } - windowInsets } - viewModel.permissionDenialLiveData.observe(this) { selectBookFolderResult.launch { mode = HandleFileContract.DIR_SYS diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt index 272a16ee0..7ee7ba152 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt @@ -7,7 +7,6 @@ import android.content.res.Configuration import android.graphics.Color import android.net.Uri import android.os.Bundle -import android.os.Looper import android.view.Gravity import android.view.HapticFeedbackConstants import android.view.InputDevice @@ -20,10 +19,12 @@ import androidx.activity.addCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.PopupMenu +import androidx.core.view.doOnPreDraw import androidx.core.view.get import androidx.core.view.size import androidx.lifecycle.lifecycleScope import com.google.android.material.transition.platform.MaterialContainerTransform +import com.google.android.material.transition.platform.MaterialSharedAxis import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import io.legato.kazusa.BuildConfig import io.legato.kazusa.R @@ -130,6 +131,7 @@ import io.legato.kazusa.utils.sysScreenOffTime import io.legato.kazusa.utils.throttle import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.visible +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Job @@ -261,64 +263,69 @@ class ReadBookActivity : BaseReadBookActivity(), @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { - window.sharedElementEnterTransition = MaterialContainerTransform().apply { + postponeEnterTransition() + val transform = MaterialContainerTransform().apply { addTarget(binding.rootView) - duration = 700 scrimColor = Color.TRANSPARENT - fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH - } - window.sharedElementReturnTransition = MaterialContainerTransform().apply { - addTarget(binding.rootView) - duration = 700 - scrimColor = Color.TRANSPARENT - fadeMode = MaterialContainerTransform.FADE_MODE_THROUGH + 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.setColorFilter(accentColor) - //binding.cursorRight.setColorFilter(accentColor) binding.cursorLeft.setOnTouchListener(this) binding.cursorRight.setOnTouchListener(this) - //window.setBackgroundDrawable(null) - upScreenTimeOut() - ReadBook.register(this) + + binding.rootView.doOnPreDraw { startPostponedEnterTransition() } + + lifecycleScope.launch(Dispatchers.Default) { + viewModel.initReadBookConfig(intent) + viewModel.initData(intent) + + withContext(Main) { + binding.readView.initAfterTransition() + justInitData = true + } + } + onBackPressedDispatcher.addCallback(this) { - if (isShowingSearchResult) { - exitSearchMenu() - restoreLastBookProcess() - return@addCallback + when { + isShowingSearchResult -> { + exitSearchMenu() + restoreLastBookProcess() + } + + ReadBook.lastBookProgress != null && confirmRestoreProcess != false -> { + restoreLastBookProcess() + } + + BaseReadAloudService.isPlay() -> { + ReadAloud.pause(this@ReadBookActivity) + toastOnUi(R.string.read_aloud_pause) + } + + isAutoPage -> { + autoPageStop() + } + + getPrefBoolean("disableReturnKey") && !menuLayoutIsVisible -> { + + } + + else -> finish() } - //拦截返回供恢复阅读进度 - 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() } } override fun onPostCreate(savedInstanceState: Bundle?) { super.onPostCreate(savedInstanceState) - viewModel.initReadBookConfig(intent) - Looper.myQueue().addIdleHandler { - viewModel.initData(intent) - false - } - justInitData = true + upScreenTimeOut() + ReadBook.register(this) } + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) viewModel.initData(intent) @@ -1095,7 +1102,9 @@ class ReadBookActivity : BaseReadBookActivity(), "page" -> ReadBook.durPageIndex else /* chapter */ -> ReadBook.durChapterIndex } - binding.readMenu.setSeekPage(progress) + if (progress >= 0) { + binding.readMenu.setSeekPage(progress) + } } /** diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt index b6d2dfe26..2dad86ab3 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt @@ -243,7 +243,6 @@ class ReadMenu @JvmOverloads constructor( } else { binding.bottomView.applyNavigationBarPadding() } - } fun reset() { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/page/ReadView.kt index 69de868a9..72c51a381 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/page/ReadView.kt @@ -118,13 +118,19 @@ class ReadView(context: Context, attrs: AttributeSet) : nextPage.invisible() curPage.markAsMainView() if (!isInEditMode) { - upBg() + //upBg() setWillNotDraw(false) - upPageAnim() - upPageSlopSquare() + //upPageAnim() + //upPageSlopSquare() } } + fun initAfterTransition() { + upBg() + upPageAnim() + upPageSlopSquare() + } + private fun setRect9x() { tlRect.set(0f, 0f, width * 0.33f, height * 0.33f) tcRect.set(width * 0.33f, 0f, width * 0.66f, height * 0.33f) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextChapter.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextChapter.kt index e36451d07..3523a9f88 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextChapter.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextChapter.kt @@ -228,9 +228,9 @@ data class TextChapter( if (pageSize == 0) { return -1 } - val bIndex = pages.fastBinarySearchBy(charIndex, 0, pageSize) { + val bIndex = pages.takeIf { it.isNotEmpty() }?.fastBinarySearchBy(charIndex, 0, pageSize) { it.chapterPosition - } + } ?: 0 val index = abs(bIndex + 1) - 1 // 判断是否已经排版到 charIndex ,没有则返回 -1 if (!isCompleted && index == pageSize - 1) { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextPage.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextPage.kt index b9364baa2..66f665a26 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextPage.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/page/entities/TextPage.kt @@ -49,7 +49,8 @@ data class TextPage( val lines: List get() = textLines val lineSize: Int get() = textLines.size val charSize: Int get() = text.length.coerceAtLeast(1) - val chapterPosition: Int get() = textLines.first().chapterPosition + val chapterPosition: Int + get() = textLines.firstOrNull()?.chapterPosition ?: 0 val searchResult = hashSetOf() var isMsgPage: Boolean = false var canvasRecorder = CanvasRecorderFactory.create(true)