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 fb2c27629..f11047ae9 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -100,6 +100,7 @@ object PreferKey { const val mangaFooterConfig = "mangaFooterConfig" const val singlePageScrolling = "singlePageScrolling" const val disableClickScroller = "disableClickScroller" + const val enableMangaHorizontalScroller="enableMangaHorizontalScroller" 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 e7fabaf61..e25e2da8a 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 @@ -651,5 +651,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefString(PreferKey.mangaFooterConfig, value) } + //漫画水平滚动 + var enableMangaHorizontalScroller + get() = appCtx.getPrefBoolean(PreferKey.enableMangaHorizontalScroller, false) + set(value) { + appCtx.putPrefBoolean(PreferKey.enableMangaHorizontalScroller, value) + } } diff --git a/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt b/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt index dbd486283..66c03d637 100644 --- a/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt +++ b/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt @@ -3,6 +3,7 @@ package io.legado.app.model.recyclerView import android.annotation.SuppressLint import android.content.Context import android.graphics.drawable.Drawable +import android.view.Gravity import android.view.ViewGroup import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT @@ -52,7 +53,7 @@ open class MangaVH(val binding: VB, private val context: Conte } @SuppressLint("CheckResult") - fun loadImageWithRetry(imageUrl: String) { + fun loadImageWithRetry(imageUrl: String, isHorizontal: Boolean) { mFlProgress.isVisible = true mLoading.isVisible = true mRetry?.isGone = true @@ -102,8 +103,14 @@ open class MangaVH(val binding: VB, private val context: Conte isFirstResource: Boolean, ): Boolean { mFlProgress.isGone = true - itemView.updateLayoutParams { - height = WRAP_CONTENT + if (!isHorizontal) { + itemView.updateLayoutParams { + height = WRAP_CONTENT + } + } else { + mImage.updateLayoutParams { + gravity = Gravity.CENTER + } } return false } 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 32bbb58ad..caeee5937 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 @@ -73,7 +73,11 @@ class ReadMangaActivity : VMBaseActivity() ReadManga.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack { private val mLayoutManager by lazy { - LinearLayoutManager(this@ReadMangaActivity) + LinearLayoutManager( + this@ReadMangaActivity, + if (AppConfig.enableMangaHorizontalScroller) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL, + false + ) } private val mAdapter: MangaAdapter by lazy { MangaAdapter(this@ReadMangaActivity) @@ -92,18 +96,8 @@ class ReadMangaActivity : VMBaseActivity() ) } - private val mPagerSnapHelper: PagerSnapHelper by lazy { - object : PagerSnapHelper() { - override fun calculateDistanceToFinalSnap( - layoutManager: RecyclerView.LayoutManager, - targetView: View - ): IntArray { - val out = IntArray(2) - out[1] = targetView.top - binding.mRecyclerMange.paddingTop - return out - } - } - } + private var mPagerSnapHelper: PagerSnapHelper? = null + private var mDisableAutoScrollPage = false private val mInitMangaAutoPageSpeed by lazy { AppConfig.mangaAutoPageSpeed @@ -197,6 +191,7 @@ class ReadMangaActivity : VMBaseActivity() } private fun initRecyclerView() { + mAdapter.isHorizontal = AppConfig.enableMangaHorizontalScroller binding.mRecyclerMange.run { adapter = mAdapter itemAnimator = null @@ -205,11 +200,14 @@ class ReadMangaActivity : VMBaseActivity() mLayoutManager.initialPrefetchItemCount = 4 mLayoutManager.isItemPrefetchEnabled = true setItemViewCacheSize(AppConfig.preDownloadNum) - singlePagerScroller(AppConfig.singlePageScrolling) + singlePagerScroller( + AppConfig.singlePageScrolling, + AppConfig.enableMangaHorizontalScroller + ) disabledClickScroller(AppConfig.disableClickScroller) disableMangaScaling(AppConfig.disableMangaScaling) - setPreScrollListener { _, _, dy, position -> - if (dy > 0 && position + 2 > mAdapter.getCurrentList().size - 3) { + setPreScrollListener { _, dx, dy, position -> + if ((dy > 0 || dx > 0) && position + 2 > mAdapter.getCurrentList().size - 3) { if (mAdapter.getCurrentList().last() is ReaderLoading) { val nextIndex = (mAdapter.getCurrentList().last() as ReaderLoading).mNextChapterIndex @@ -319,7 +317,7 @@ class ReadMangaActivity : VMBaseActivity() chapterPageCount: Int, chapterPos: Int, chapterCount: Int, - chapterName: String + chapterName: String, ) { mMangaFooterConfig.run { mLabelBuilder.clear() @@ -490,7 +488,7 @@ class ReadMangaActivity : VMBaseActivity() R.id.menu_scroller_page -> { item.isChecked = !item.isChecked AppConfig.singlePageScrolling = item.isChecked - singlePagerScroller(item.isChecked) + singlePagerScroller(item.isChecked, AppConfig.enableMangaHorizontalScroller) } R.id.menu_disable_manga_scaling -> { @@ -531,6 +529,19 @@ class ReadMangaActivity : VMBaseActivity() R.id.menu_manga_footer_config -> { MangaFooterSettingDialog().show(supportFragmentManager, "mangaFooterSettingDialog") } + + R.id.menu_enable_horizontal_scroller -> { + item.isChecked = !item.isChecked + AppConfig.enableMangaHorizontalScroller = item.isChecked + mLayoutManager.orientation = + if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL + singlePagerScroller(AppConfig.singlePageScrolling, item.isChecked) + mAdapter.isHorizontal = item.isChecked + mAdapter.notifyItemRangeChanged( + ReadManga.durChapterPos.minus(2), + mAdapter.getCurrentList().size + ) + } } return super.onCompatOptionsItemSelected(item) } @@ -576,11 +587,26 @@ class ReadMangaActivity : VMBaseActivity() binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!) } - private fun singlePagerScroller(value: Boolean) { - if (value) { - mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerMange) + 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) } else { - mPagerSnapHelper.attachToRecyclerView(null) + mPagerSnapHelper?.attachToRecyclerView(null) } } @@ -594,6 +620,8 @@ class ReadMangaActivity : VMBaseActivity() menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroller menu.findItem(R.id.menu_manga_auto_page_speed).title = getString(R.string.manga_auto_page_speed, mMangaAutoPageSpeed) + menu.findItem(R.id.menu_enable_horizontal_scroller).isChecked = + AppConfig.enableMangaHorizontalScroller } private fun disableMangaScaling(disable: Boolean) { @@ -662,7 +690,7 @@ class ReadMangaActivity : VMBaseActivity() min: Int, title: String, initValue: Int, - callback: (Int) -> Unit + callback: (Int) -> Unit, ) { NumberPickerDialog(this) .setTitle(title) diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt index 19d3afee4..c63ebd6a1 100644 --- a/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt @@ -22,8 +22,8 @@ import io.legado.app.databinding.BookComicRvBinding import io.legado.app.help.glide.progress.ProgressManager import io.legado.app.model.BookCover import io.legado.app.model.ReadManga -import io.legado.app.model.recyclerView.MangaVH import io.legado.app.model.recyclerView.MangaContent +import io.legado.app.model.recyclerView.MangaVH import io.legado.app.model.recyclerView.ReaderLoading import io.legado.app.utils.getCompatDrawable import java.util.Collections @@ -37,6 +37,8 @@ class MangaAdapter(private val context: Context) : private const val CONTENT_VIEW = 1 } + var isHorizontal = false + private val mDiffCallback: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { return if (oldItem is ReaderLoading && newItem is ReaderLoading) { @@ -89,13 +91,13 @@ class MangaAdapter(private val context: Context) : binding.retry.setOnClickListener { val item = mDiffer.currentList[layoutPosition] if (item is MangaContent) { - loadImageWithRetry(item.mImageUrl) + loadImageWithRetry(item.mImageUrl, isHorizontal) } } } fun onBind(item: MangaContent) { - loadImageWithRetry(item.mImageUrl) + loadImageWithRetry(item.mImageUrl, isHorizontal) } } diff --git a/app/src/main/res/menu/book_manga.xml b/app/src/main/res/menu/book_manga.xml index 931648016..632ba8b13 100644 --- a/app/src/main/res/menu/book_manga.xml +++ b/app/src/main/res/menu/book_manga.xml @@ -54,12 +54,19 @@ + + + app:showAsAction="never" /> diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 593863fbe..fd4773838 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1205,4 +1205,5 @@ 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index ef8c1bae8..d8dd7f9ad 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1208,4 +1208,5 @@ 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index d02efb63f..a4d369118 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1208,4 +1208,5 @@ 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e50e90094..d64c2b4e0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1204,4 +1204,5 @@ Còn 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b3188369a..bd3304ab1 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1205,4 +1205,5 @@ 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bc49997d4..96e569981 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1207,4 +1207,5 @@ 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index e6ca78afa..911300877 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1207,4 +1207,5 @@ 页脚 靠左 居中 + 水平滚动 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 77dfc743a..9c2279238 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1208,4 +1208,5 @@ 页脚 靠左 居中 + 水平滚动