From 76d2f435edc070427131e981bbc948226bb913fb Mon Sep 17 00:00:00 2001 From: lhjgege <1079947827@qq.com> Date: Tue, 18 Feb 2025 17:34:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20(#4713)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 升级RecyclerView适配自适应刷新率 * 减小菜单点击区域 * ... * 修复显示章节位置问题,修复顶部间距问题 * 显示漫画名称 * ... * ... * 漫画缩放移植到右上角 增加预加载数量设置 增加单页滚动 --- .../java/io/legado/app/constant/PreferKey.kt | 2 + .../io/legado/app/help/config/AppConfig.kt | 19 +++- .../app/ui/book/manga/ReadMangaActivity.kt | 93 ++++++++++++++++--- .../app/ui/book/manga/rv/WebtoonFrame.kt | 5 +- .../ui/book/manga/rv/WebtoonRecyclerView.kt | 39 ++++++-- app/src/main/res/layout/activity_mange.xml | 1 + app/src/main/res/menu/book_manga.xml | 19 ++++ app/src/main/res/values-es-rES/strings.xml | 2 + app/src/main/res/values-ja-rJP/strings.xml | 2 + app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-vi/strings.xml | 2 + app/src/main/res/values-zh-rHK/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values-zh/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/pref_config_other.xml | 6 -- 16 files changed, 170 insertions(+), 30 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 b5960674c..a65cf792e 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -95,6 +95,8 @@ object PreferKey { const val bitmapCacheSize = "bitmapCacheSize" const val imageRetainNum = "imageRetainNum" const val preDownloadNum = "preDownloadNum" + const val preMangaDownloadNum = "preMangaDownloadNum" + const val singlePageScrolling="singlePageScrolling" const val autoRefresh = "auto_refresh" const val defaultToRead = "defaultToRead" const val exportCharset = "exportCharset" 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 3d25d5d22..06456b24f 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 @@ -610,7 +610,24 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { get() = appCtx.getPrefBoolean(PreferKey.showMangaUi, true) //禁用漫画缩放 - val disableMangaScaling: Boolean + var disableMangaScaling: Boolean get() = appCtx.getPrefBoolean(PreferKey.disableMangaScaling, true) + set(value) { + appCtx.putPrefBoolean(PreferKey.disableMangaScaling, value) + } + + //漫画预加载数量 + var preMangaDownloadNum + get() = appCtx.getPrefInt(PreferKey.preMangaDownloadNum, 10) + set(value) { + appCtx.putPrefInt(PreferKey.preMangaDownloadNum, value) + } + + //单页滚动 + var singlePageScrolling + get() = appCtx.getPrefBoolean(PreferKey.singlePageScrolling, false) + set(value) { + appCtx.putPrefBoolean(PreferKey.singlePageScrolling, value) + } } 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 6dd0e14e0..66966c9e0 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 @@ -1,5 +1,6 @@ package io.legado.app.ui.book.manga +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.os.Looper @@ -14,6 +15,7 @@ import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.PagerSnapHelper import com.bumptech.glide.Glide import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL @@ -42,6 +44,7 @@ import io.legado.app.ui.book.manga.rv.MangaAdapter import io.legado.app.ui.book.read.MangaMenu import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED import io.legado.app.ui.book.toc.TocActivityResult +import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.recycler.LoadMoreView import io.legado.app.utils.NetworkUtils import io.legado.app.utils.StartActivityContract @@ -64,17 +67,29 @@ class ReadMangaActivity : VMBaseActivity() private val mAdapter: MangaAdapter by lazy { MangaAdapter(this@ReadMangaActivity) } + private val mPreDownloadNum by lazy { + AppConfig.preMangaDownloadNum + } + private val mSinglePageScroller by lazy { + AppConfig.singlePageScrolling + } + + private val mDisableMangaScaling by lazy { + AppConfig.disableMangaScaling + } + private val mSizeProvider by lazy { FixedPreloadSizeProvider( - this@ReadMangaActivity.resources.displayMetrics.widthPixels, - SIZE_ORIGINAL + this@ReadMangaActivity.resources.displayMetrics.widthPixels, SIZE_ORIGINAL ) } - private val mRecyclerViewPreloader by lazy { - RecyclerViewPreloader(Glide.with(this), mAdapter, mSizeProvider, 10) + private val mPagerSnapHelper: PagerSnapHelper by lazy { + PagerSnapHelper() } + private var mRecyclerViewPreloader: RecyclerViewPreloader? = null + private val networkChangedListener by lazy { NetworkChangedListener(this) } @@ -95,13 +110,12 @@ class ReadMangaActivity : VMBaseActivity() } //打开目录返回选择章节返回结果 - private val tocActivity = - registerForActivityResult(TocActivityResult()) { - it?.let { - binding.flLoading.isVisible = true - viewModel.openChapter(it.first, it.second) - } + private val tocActivity = registerForActivityResult(TocActivityResult()) { + it?.let { + binding.flLoading.isVisible = true + viewModel.openChapter(it.first, it.second) } + } private val bookInfoActivity = registerForActivityResult(StartActivityContract(BookInfoActivity::class.java)) { if (it.resultCode == RESULT_OK) { @@ -122,6 +136,7 @@ class ReadMangaActivity : VMBaseActivity() } } ReadManga.register(this) + disableMangaScaling(mDisableMangaScaling) binding.mRecyclerMange.run { adapter = mAdapter itemAnimator = null @@ -130,6 +145,7 @@ class ReadMangaActivity : VMBaseActivity() mLayoutManager.initialPrefetchItemCount = 4 mLayoutManager.isItemPrefetchEnabled = true setItemViewCacheSize(AppConfig.preDownloadNum) + singlePagerScroller(mSinglePageScroller) setPreScrollListener { _, _, dy, position -> if (dy > 0 && position + 2 > mAdapter.getCurrentList().size - 3) { if (mAdapter.getCurrentList().last() is ReaderLoading) { @@ -162,7 +178,7 @@ class ReadMangaActivity : VMBaseActivity() } } - addOnScrollListener(mRecyclerViewPreloader) + addRecyclerViewPreloader(mPreDownloadNum) onToucheMiddle { if (!binding.mangaMenu.isVisible) { binding.mangaMenu.runMenuIn() @@ -347,14 +363,17 @@ class ReadMangaActivity : VMBaseActivity() } + @SuppressLint("StringFormatMatches") override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.book_manga, menu) + upMenu(menu) return super.onCompatCreateOptionsMenu(menu) } /** * 菜单 */ + @SuppressLint("StringFormatMatches") override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_change_source -> { @@ -369,6 +388,27 @@ class ReadMangaActivity : VMBaseActivity() tocActivity.launch(it.bookUrl) } } + + R.id.menu_pre_manga_number -> { + NumberPickerDialog(this).setTitle(getString(R.string.pre_download)) + .setMaxValue(9999).setMinValue(0).setValue(AppConfig.preMangaDownloadNum).show { + AppConfig.preMangaDownloadNum = it + item.setTitle(getString(R.string.pre_download_m, it)) + addRecyclerViewPreloader(it) + } + } + + R.id.menu_scroller_page -> { + item.isChecked = !item.isChecked + AppConfig.singlePageScrolling = item.isChecked + singlePagerScroller(item.isChecked) + } + + R.id.menu_disable_manga_scaling -> { + item.isChecked = !item.isChecked + AppConfig.disableMangaScaling = item.isChecked + disableMangaScaling(item.isChecked) + } } return super.onCompatOptionsItemSelected(item) } @@ -405,4 +445,35 @@ class ReadMangaActivity : VMBaseActivity() return super.dispatchKeyEvent(event) } + private fun addRecyclerViewPreloader(maxPreload: Int) { + if (mRecyclerViewPreloader != null) { + binding.mRecyclerMange.removeOnScrollListener(mRecyclerViewPreloader!!) + } + mRecyclerViewPreloader = RecyclerViewPreloader( + Glide.with(this), mAdapter, mSizeProvider, maxPreload + ) + binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!) + } + + private fun singlePagerScroller(value: Boolean) { + if (value) { + mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerMange) + } else { + mPagerSnapHelper.attachToRecyclerView(null) + } + } + + @SuppressLint("StringFormatMatches") + private fun upMenu(menu: Menu) { + menu.findItem(R.id.menu_pre_manga_number) + .setTitle(getString(R.string.pre_download_m, mPreDownloadNum)) + menu.findItem(R.id.menu_scroller_page).isChecked = mSinglePageScroller + menu.findItem(R.id.menu_disable_manga_scaling).isChecked = mDisableMangaScaling + } + + private fun disableMangaScaling(disable: Boolean) { + binding.webtoonFrame.disableMangaScaling = disable + binding.mRecyclerMange.disableMangaScaling = disable + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt index 276425149..5bdf8141a 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt @@ -7,7 +7,6 @@ import android.view.GestureDetector import android.view.MotionEvent import android.view.ScaleGestureDetector import android.widget.FrameLayout -import io.legado.app.help.config.AppConfig class WebtoonFrame : FrameLayout { @@ -29,11 +28,13 @@ class WebtoonFrame : FrameLayout { scaleDetector.isQuickScaleEnabled = value } + var disableMangaScaling = false + private val recycler: WebtoonRecyclerView? get() = getChildAt(0) as? WebtoonRecyclerView override fun dispatchTouchEvent(ev: MotionEvent): Boolean { - if (!AppConfig.disableMangaScaling) { + if (!disableMangaScaling) { scaleDetector.onTouchEvent(ev) flingDetector.onTouchEvent(ev) val recyclerRect = Rect() diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt index 438a8120d..3ff35b9e7 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt @@ -12,7 +12,6 @@ import android.view.animation.DecelerateInterpolator import androidx.core.animation.doOnEnd import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import io.legado.app.help.config.AppConfig import io.legado.app.utils.findCenterViewPosition import kotlin.math.abs @@ -40,17 +39,23 @@ class WebtoonRecyclerView @JvmOverloads constructor( private val listener = GestureListener() private val detector = Detector() private val mcRect = RectF() - private var mToucheMiddle: (() -> Unit)? = null + private val blRect = RectF() + private val brRect = RectF() //起始点 private var startX: Float = 0f private var startY: Float = 0f - var doubleTapZoom = true - var tapListener: ((MotionEvent) -> Unit)? = null var longTapListener: ((MotionEvent) -> Boolean)? = null + var disableMangaScaling = false + + private var mToucheMiddle: (() -> Unit)? = null fun onToucheMiddle(init: () -> Unit) = apply { this.mToucheMiddle = init } + private var mNextPage: (() -> Unit)? = null + fun onNextPage(init: () -> Unit) = apply { this.mNextPage = init } + private var mPrevPage: (() -> Unit)? = null + fun onPrevPage(init: () -> Unit) = apply { this.mPrevPage = init } override fun onMeasure(widthSpec: Int, heightSpec: Int) { halfWidth = MeasureSpec.getSize(widthSpec) / 2 @@ -102,7 +107,9 @@ class WebtoonRecyclerView @JvmOverloads constructor( override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) - mcRect.set(width * 0.33f, height * 0.33f, width * 0.66f, height * 0.66f) + mcRect.set(width * 0.33f, height * 0.33f, width * 0.66f, height * 0.46f) + blRect.set(0f, height * 0.66f, width * 0.33f, height.toFloat()) + brRect.set(width * 0.66f, height * 0.66f, width.toFloat(), height.toFloat()) } private fun getPositionX(positionX: Float): Float { @@ -240,10 +247,23 @@ class WebtoonRecyclerView @JvmOverloads constructor( inner class GestureListener : GestureDetectorWithLongTap.Listener() { override fun onSingleTapConfirmed(ev: MotionEvent): Boolean { - if (mcRect.contains(startX, startY)) { - mToucheMiddle?.invoke() - } else { - tapListener?.invoke(ev) + when { + mcRect.contains(startX, startY) -> { + mToucheMiddle?.invoke() + } + + blRect.contains(startX, startY) -> { + mPrevPage?.invoke() + } + + brRect.contains(startX, startY) -> { + mNextPage?.invoke() + } + + else -> { + tapListener?.invoke(ev) + + } } return false } @@ -282,7 +302,6 @@ class WebtoonRecyclerView @JvmOverloads constructor( private var isZoomDragging = false var isDoubleTapping = false var isQuickScaling = false - val disableMangaScaling = AppConfig.disableMangaScaling override fun onTouchEvent(ev: MotionEvent): Boolean { val action = ev.actionMasked val actionIndex = ev.actionIndex diff --git a/app/src/main/res/layout/activity_mange.xml b/app/src/main/res/layout/activity_mange.xml index 626c749c0..02d66df5f 100644 --- a/app/src/main/res/layout/activity_mange.xml +++ b/app/src/main/res/layout/activity_mange.xml @@ -1,5 +1,6 @@ + + + + + + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 69b72f5d9..e09eebcf6 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -820,6 +820,8 @@ Exportar lista de libros 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 26609bbc9..ec60936af 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -823,6 +823,8 @@ Export the list of books 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 9bf70d57a..50bc2b84b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -821,6 +821,8 @@ Exportar a lista de livros 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 651c4f391..c78691e0f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -822,6 +822,8 @@ Còn Xuất bookshelf 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 5f08a7fff..31a49b75b 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -821,6 +821,8 @@ 導出書單 導入書單 預下載 + 預下載%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 10f2955c0..9aacbe221 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -824,6 +824,8 @@ 匯出書單 匯入書單 預下載 + 预下载%s页 + 单页滚动 預先下載%s章正文 是否啟用 背景圖片 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 360d0e4a0..d7202a8af 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -827,6 +827,8 @@ 导出书单 导入书单 预下载 + 单页滚动 + 预下载%s页 预先下载 %s 章正文 是否启用 背景图片 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1c750d49..986edda6a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -828,6 +828,8 @@ Export the list of books Import the list of books Download in advance + Pre-download %s pages + Single Page Scroller Download %s chapters in advance Is enabled Background image diff --git a/app/src/main/res/xml/pref_config_other.xml b/app/src/main/res/xml/pref_config_other.xml index a5e2a24c8..6608300d8 100644 --- a/app/src/main/res/xml/pref_config_other.xml +++ b/app/src/main/res/xml/pref_config_other.xml @@ -174,12 +174,6 @@ android:title="@string/show_mange_ui" app:iconSpaceReserved="false" /> - -