From 127aee762d7a5552748c3b4a580b253420f74e75 Mon Sep 17 00:00:00 2001 From: lhjgege <1079947827@qq.com> Date: Tue, 4 Mar 2025 22:39:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=B7=E6=96=B0=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=87=E6=8D=A2=E7=AB=A0=E8=8A=82=20(#4784?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 调整页脚章节标题位置 * 修复章节切换问题 * 增加刷新 * 调整屏幕滚动问题 * ... * 修复图片过长滚动问题 * ... --- .../java/io/legado/app/constant/PreferKey.kt | 1 - .../io/legado/app/help/config/AppConfig.kt | 7 -- .../java/io/legado/app/model/ReadManga.kt | 7 +- .../app/ui/book/manga/MangaViewModel.kt | 10 ++ .../app/ui/book/manga/ReadMangaActivity.kt | 108 ++++++++---------- app/src/main/res/menu/book_manga.xml | 13 +-- app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-ja-rJP/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values-zh/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - 14 files changed, 70 insertions(+), 84 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 8f652257c..888151880 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -98,7 +98,6 @@ object PreferKey { const val mangaPreDownloadNum = "mangaPreDownloadNum" const val mangaAutoPageSpeed = "mangaAutoPageSpeed" const val mangaFooterConfig = "mangaFooterConfig" - const val singlePageScroll = "singlePageScroll" const val disableClickScroll = "disableClickScroll" const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll" const val autoRefresh = "auto_refresh" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index bef071b85..b362313fe 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -623,13 +623,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value) } - //单页滚动 - var singlePageScroll - get() = appCtx.getPrefBoolean(PreferKey.singlePageScroll, false) - set(value) { - appCtx.putPrefBoolean(PreferKey.singlePageScroll, value) - } - //点击翻页 var disableClickScroll get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false) diff --git a/app/src/main/java/io/legado/app/model/ReadManga.kt b/app/src/main/java/io/legado/app/model/ReadManga.kt index 1c264f431..aa2819743 100644 --- a/app/src/main/java/io/legado/app/model/ReadManga.kt +++ b/app/src/main/java/io/legado/app/model/ReadManga.kt @@ -74,10 +74,10 @@ object ReadManga : CoroutineScope by MainScope() { val book = book ?: return@execute book.lastCheckCount = 0 book.durChapterTime = System.currentTimeMillis() - val chapterChanged = book.durChapterIndex != durChapterPagePos + val changed = book.durChapterIndex != durChapterPagePos book.durChapterIndex = durChapterPagePos book.durChapterPos = durChapterPos - if (!pageChanged || chapterChanged) { + if (!pageChanged || changed) { appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let { book.durChapterTitle = it.getDisplayTitle( ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(), @@ -209,6 +209,9 @@ object ReadManga : CoroutineScope by MainScope() { fun loadContent( index: Int, ) { + if (chapterChanged) { + removeLoading(index) + } if (addLoading(index)) { Coroutine.async { val book = book!! diff --git a/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt b/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt index 7d5b6d255..aacbf9fab 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt @@ -246,4 +246,14 @@ class MangaViewModel(application: Application) : BaseViewModel(application) { super.onCleared() changeSourceCoroutine?.cancel() } + + fun refreshContentDur(book: Book) { + execute { + appDb.bookChapterDao.getChapter(book.bookUrl, ReadManga.durChapterPagePos) + ?.let { chapter -> + BookHelp.delContent(book, chapter) + openChapter(ReadManga.durChapterPagePos, ReadManga.durChapterPos) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt index b4c0c3721..dd640ca12 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt @@ -10,14 +10,12 @@ import android.os.Looper import android.view.KeyEvent import android.view.Menu import android.view.MenuItem -import android.view.View import android.view.WindowManager import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide @@ -82,13 +80,6 @@ class ReadMangaActivity : VMBaseActivity() private val mAdapter: MangaAdapter by lazy { MangaAdapter(this@ReadMangaActivity) } - private val mSmoothScroller by lazy { - object : LinearSmoothScroller(this@ReadMangaActivity) { - override fun getVerticalSnapPreference(): Int { - return SNAP_TO_START - } - } - } private val mSizeProvider by lazy { FixedPreloadSizeProvider( @@ -96,7 +87,9 @@ class ReadMangaActivity : VMBaseActivity() ) } - private var mPagerSnapHelper: PagerSnapHelper? = null + private val mPagerSnapHelper: PagerSnapHelper by lazy { + PagerSnapHelper() + } private var mDisableAutoScrollPage = false private val mInitMangaAutoPageSpeed by lazy { @@ -201,7 +194,6 @@ class ReadMangaActivity : VMBaseActivity() mLayoutManager.isItemPrefetchEnabled = true setItemViewCacheSize(AppConfig.preDownloadNum) singlePagerScroller( - AppConfig.singlePageScroll, AppConfig.enableMangaHorizontalScroll ) disabledClickScroller(AppConfig.disableClickScroll) @@ -473,6 +465,13 @@ class ReadMangaActivity : VMBaseActivity() } } + R.id.menu_refresh -> { + binding.flLoading.isVisible = true + ReadManga.book?.let { + viewModel.refreshContentDur(it) + } + } + R.id.menu_pre_manga_number -> { showNumberPickerDialog( 0, @@ -485,12 +484,6 @@ class ReadMangaActivity : VMBaseActivity() } } - R.id.menu_scroller_page -> { - item.isChecked = !item.isChecked - AppConfig.singlePageScroll = item.isChecked - singlePagerScroller(item.isChecked, AppConfig.enableMangaHorizontalScroll) - } - R.id.menu_disable_manga_scale -> { item.isChecked = !item.isChecked AppConfig.disableMangaScale = item.isChecked @@ -535,7 +528,7 @@ class ReadMangaActivity : VMBaseActivity() AppConfig.enableMangaHorizontalScroll = item.isChecked mLayoutManager.orientation = if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL - singlePagerScroller(AppConfig.singlePageScroll, item.isChecked) + singlePagerScroller(item.isChecked) mAdapter.isHorizontal = item.isChecked mAdapter.notifyItemRangeChanged( ReadManga.durChapterPos.minus(2), @@ -587,26 +580,11 @@ class ReadMangaActivity : VMBaseActivity() binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!) } - private fun singlePagerScroller(enableSingleScroll: Boolean, enableHorizontalScroll: Boolean) { - if (enableSingleScroll) { - mPagerSnapHelper?.attachToRecyclerView(null) - mPagerSnapHelper = if (enableHorizontalScroll) { - PagerSnapHelper() - } else { - object : PagerSnapHelper() { - override fun calculateDistanceToFinalSnap( - layoutManager: RecyclerView.LayoutManager, - targetView: View, - ): IntArray { - val out = IntArray(2) - out[1] = targetView.top - binding.mRecyclerMange.paddingTop - return out - } - } - } - mPagerSnapHelper?.attachToRecyclerView(binding.mRecyclerMange) + private fun singlePagerScroller(enableHorizontalScroll: Boolean) { + if (enableHorizontalScroll) { + mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerMange) } else { - mPagerSnapHelper?.attachToRecyclerView(null) + mPagerSnapHelper.attachToRecyclerView(null) } } @@ -615,7 +593,6 @@ class ReadMangaActivity : VMBaseActivity() this.mMenu = menu menu.findItem(R.id.menu_pre_manga_number).title = getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum) - menu.findItem(R.id.menu_scroller_page).isChecked = AppConfig.singlePageScroll menu.findItem(R.id.menu_disable_manga_scale).isChecked = AppConfig.disableMangaScale menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroll menu.findItem(R.id.menu_manga_auto_page_speed).title = @@ -646,34 +623,35 @@ class ReadMangaActivity : VMBaseActivity() } private fun scrollToNext() { - val lastCompletelyVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition() - val nextPosition = if (lastCompletelyVisiblePosition != RecyclerView.NO_POSITION) { - lastCompletelyVisiblePosition + 1 - } else { - mLayoutManager.findFirstVisibleItemPosition() + 1 - } - if (nextPosition > mAdapter.getCurrentList().lastIndex) { + if (binding.mRecyclerMange.isAtBottom()) { return } - smoothScrollToPosition(nextPosition) + val (dx, dy) = if (AppConfig.enableMangaHorizontalScroll) { + val width = + binding.mRecyclerMange.width - binding.mRecyclerMange.paddingStart - binding.mRecyclerMange.paddingEnd + Pair(width, 0) + } else { + val height = + binding.mRecyclerMange.height - binding.mRecyclerMange.paddingTop - binding.mRecyclerMange.paddingBottom + Pair(0, height) + } + binding.mRecyclerMange.smoothScrollBy(dx, dy, null) } private fun scrollToPrev() { - val firstCompletelyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition() - val prevPosition = if (firstCompletelyVisiblePosition != RecyclerView.NO_POSITION) { - firstCompletelyVisiblePosition - 1 - } else { - mLayoutManager.findFirstVisibleItemPosition() - 1 - } - if (prevPosition < 0) { + if (binding.mRecyclerMange.isAtTop()) { return } - smoothScrollToPosition(prevPosition) - } - - private fun smoothScrollToPosition(position: Int) { - mSmoothScroller.targetPosition = position - mLayoutManager.startSmoothScroll(mSmoothScroller) + val (dx, dy) = if (AppConfig.enableMangaHorizontalScroll) { + val width = + binding.mRecyclerMange.width - binding.mRecyclerMange.paddingStart - binding.mRecyclerMange.paddingEnd + Pair(width, 0) + } else { + val height = + binding.mRecyclerMange.height - binding.mRecyclerMange.paddingTop - binding.mRecyclerMange.paddingBottom + Pair(0, height) + } + binding.mRecyclerMange.smoothScrollBy(-dx, -dy, null) } private fun startAutoPage() { @@ -724,4 +702,16 @@ class ReadMangaActivity : VMBaseActivity() } } } + + private fun RecyclerView.isAtTop(): Boolean { + return (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) && !canScrollVertically( + -1 + ) + } + + private fun RecyclerView.isAtBottom(): Boolean { + val adapter = adapter ?: return false + return (mLayoutManager.findLastCompletelyVisibleItemPosition() == adapter.itemCount - 1) && + !canScrollVertically(1) + } } \ No newline at end of file diff --git a/app/src/main/res/menu/book_manga.xml b/app/src/main/res/menu/book_manga.xml index 744ca288c..d0ac96e09 100644 --- a/app/src/main/res/menu/book_manga.xml +++ b/app/src/main/res/menu/book_manga.xml @@ -11,6 +11,12 @@ android:title="@string/change_origin" app:showAsAction="always" /> + + - - Importar lista de libros Descarga anterior 预下载%s页 - 单页滚动 Descargue %s capítulos antes Está habilitado Imagen de fondo diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index b2901b70d..720e6b7ed 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -824,7 +824,6 @@ Import the list of books Download in advance 预下载%s页 - 单页滚动 Download %s chapters in advance Is enabled Background image diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f520e2899..6921c05ce 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -822,7 +822,6 @@ Importar a lista de livros Baixar antecipadamente 预下载%s页 - 单页滚动 Baixar %s capítulos antecipadamente Está ativado Imagem de fundo diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index da8011439..3434bd12f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -823,7 +823,6 @@ Còn Nhập bookshelf Tải xuống trước 预下载%s页 - 单页滚动 Tải xuống trước %s chương Đã bật Ảnh nền diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b35512345..4e09ca8be 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -822,7 +822,6 @@ 導入書單 預下載 預下載%s页 - 单页滚动 預先下載%s章正文 係咪啟用 背景圖片 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index cb8b8b510..22e85ba9f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -825,7 +825,6 @@ 匯入書單 預下載 预下载%s页 - 单页滚动 預先下載%s章正文 是否啟用 背景圖片 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4b95728b2..4e58ba49d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -827,7 +827,6 @@ 导出书单 导入书单 预下载 - 单页滚动 预下载%s页 预先下载 %s 章正文 是否启用 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 331e29f4a..af5c7ef1b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -829,7 +829,6 @@ Import the list of books Download in advance Pre-download %s pages - Single Page Scroller Download %s chapters in advance Is enabled Background image