mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user