增加水平滚动 (#4760)

* 优化

* 页脚增加章节名称配置,增加返回提示加入书架

* 增加水平滚动
This commit is contained in:
lhjgege
2025-03-02 16:09:37 +08:00
committed by GitHub
parent 72dbab3d84
commit 3ea8eb67d2
14 changed files with 90 additions and 31 deletions

View File

@@ -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"

View File

@@ -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)
}
}

View File

@@ -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<VB : ViewBinding>(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<VB : ViewBinding>(val binding: VB, private val context: Conte
isFirstResource: Boolean,
): Boolean {
mFlProgress.isGone = true
itemView.updateLayoutParams<ViewGroup.LayoutParams> {
height = WRAP_CONTENT
if (!isHorizontal) {
itemView.updateLayoutParams<ViewGroup.LayoutParams> {
height = WRAP_CONTENT
}
} else {
mImage.updateLayoutParams<FrameLayout.LayoutParams> {
gravity = Gravity.CENTER
}
}
return false
}

View File

@@ -73,7 +73,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
)
}
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<ActivityMangaBinding, MangaViewModel>()
}
private fun initRecyclerView() {
mAdapter.isHorizontal = AppConfig.enableMangaHorizontalScroller
binding.mRecyclerMange.run {
adapter = mAdapter
itemAnimator = null
@@ -205,11 +200,14 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
chapterPageCount: Int,
chapterPos: Int,
chapterCount: Int,
chapterName: String
chapterName: String,
) {
mMangaFooterConfig.run {
mLabelBuilder.clear()
@@ -490,7 +488,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
min: Int,
title: String,
initValue: Int,
callback: (Int) -> Unit
callback: (Int) -> Unit,
) {
NumberPickerDialog(this)
.setTitle(title)

View File

@@ -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<Any> = object : DiffUtil.ItemCallback<Any>() {
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)
}
}

View File

@@ -54,12 +54,19 @@
<item
android:id="@+id/menu_manga_auto_page_speed"
android:visible="false"
android:title="@string/manga_auto_page_speed"
android:visible="false"
app:showAsAction="never" />
<item
android:id="@+id/menu_enable_horizontal_scroller"
android:checkable="true"
android:checked="false"
android:title="@string/enable_manga_horizontal_scroller"
app:showAsAction="never" />
<item
android:id="@+id/menu_manga_footer_config"
android:title="@string/manga_footer_config"
app:showAsAction="never"/>
app:showAsAction="never" />
</menu>

View File

@@ -1205,4 +1205,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1208,4 +1208,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1208,4 +1208,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1204,4 +1204,5 @@ Còn </string>
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1205,4 +1205,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1207,4 +1207,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1207,4 +1207,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>

View File

@@ -1208,4 +1208,5 @@
<string name="manga_header_footer">页脚</string>
<string name="manga_radio_left">靠左</string>
<string name="manga_radio_center">居中</string>
<string name="enable_manga_horizontal_scroller">水平滚动</string>
</resources>