增加刷新,修复切换章节 (#4784)

* 调整页脚章节标题位置

* 修复章节切换问题

* 增加刷新

* 调整屏幕滚动问题

* ...

* 修复图片过长滚动问题

* ...
This commit is contained in:
lhjgege
2025-03-04 22:39:39 +08:00
committed by GitHub
parent 07e20ff9c9
commit 127aee762d
14 changed files with 70 additions and 84 deletions
@@ -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"
@@ -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)
@@ -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!!
@@ -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)
}
}
}
}
@@ -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<ActivityMangaBinding, MangaViewModel>()
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<Any>(
@@ -96,7 +87,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
)
}
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<ActivityMangaBinding, MangaViewModel>()
mLayoutManager.isItemPrefetchEnabled = true
setItemViewCacheSize(AppConfig.preDownloadNum)
singlePagerScroller(
AppConfig.singlePageScroll,
AppConfig.enableMangaHorizontalScroll
)
disabledClickScroller(AppConfig.disableClickScroll)
@@ -473,6 +465,13 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
}
}
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<ActivityMangaBinding, MangaViewModel>()
}
}
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<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
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<ActivityMangaBinding, MangaViewModel>()
}
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<ActivityMangaBinding, MangaViewModel>()
}
}
}
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)
}
}
+6 -7
View File
@@ -11,6 +11,12 @@
android:title="@string/change_origin"
app:showAsAction="always" />
<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_refresh_black_24dp"
android:title="@string/refresh"
app:showAsAction="always" />
<item
android:id="@+id/menu_catalog"
android:icon="@drawable/ic_toc"
@@ -24,13 +30,6 @@
android:title="@string/pre_download"
app:showAsAction="never" />
<item
android:id="@+id/menu_scroller_page"
android:checkable="true"
android:checked="false"
android:title="@string/single_page_scroller"
app:showAsAction="never" />
<item
android:id="@+id/menu_disable_manga_scale"
android:checkable="true"
@@ -821,7 +821,6 @@
<string name="import_bookshelf">Importar lista de libros</string>
<string name="pre_download">Descarga anterior</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Descargue %s capítulos antes</string>
<string name="is_enabled">Está habilitado</string>
<string name="background_image">Imagen de fondo</string>
@@ -824,7 +824,6 @@
<string name="import_bookshelf">Import the list of books</string>
<string name="pre_download">Download in advance</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Download %s chapters in advance</string>
<string name="is_enabled">Is enabled</string>
<string name="background_image">Background image</string>
@@ -822,7 +822,6 @@
<string name="import_bookshelf">Importar a lista de livros</string>
<string name="pre_download">Baixar antecipadamente</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Baixar %s capítulos antecipadamente</string>
<string name="is_enabled">Está ativado</string>
<string name="background_image">Imagem de fundo</string>
-1
View File
@@ -823,7 +823,6 @@ Còn </string>
<string name="import_bookshelf">Nhập bookshelf</string>
<string name="pre_download">Tải xuống trước</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">Tải xuống trước %s chương</string>
<string name="is_enabled">Đã bật</string>
<string name="background_image">Ảnh nền</string>
@@ -822,7 +822,6 @@
<string name="import_bookshelf">導入書單</string>
<string name="pre_download">預下載</string>
<string name="pre_download_m">預下載%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">預先下載%s章正文</string>
<string name="is_enabled">係咪啟用</string>
<string name="background_image">背景圖片</string>
@@ -825,7 +825,6 @@
<string name="import_bookshelf">匯入書單</string>
<string name="pre_download">預下載</string>
<string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">預先下載%s章正文</string>
<string name="is_enabled">是否啟用</string>
<string name="background_image">背景圖片</string>
-1
View File
@@ -827,7 +827,6 @@
<string name="export_bookshelf">导出书单</string>
<string name="import_bookshelf">导入书单</string>
<string name="pre_download">预下载</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_m">预下载%s页</string>
<string name="pre_download_s">预先下载 %s 章正文</string>
<string name="is_enabled">是否启用</string>
-1
View File
@@ -829,7 +829,6 @@
<string name="import_bookshelf">Import the list of books</string>
<string name="pre_download">Download in advance</string>
<string name="pre_download_m">Pre-download %s pages</string>
<string name="single_page_scroller">Single Page Scroller</string>
<string name="pre_download_s">Download %s chapters in advance</string>
<string name="is_enabled">Is enabled</string>
<string name="background_image">Background image</string>