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

* 调整页脚章节标题位置

* 修复章节切换问题

* 增加刷新

* 调整屏幕滚动问题

* ...

* 修复图片过长滚动问题

* ...
This commit is contained in:
lhjgege
2025-03-04 22:39:39 +08:00
committed by GitHub
parent 232185d08c
commit 3e8438df5f
14 changed files with 70 additions and 84 deletions
@@ -98,7 +98,6 @@ object PreferKey {
const val mangaPreDownloadNum = "mangaPreDownloadNum" const val mangaPreDownloadNum = "mangaPreDownloadNum"
const val mangaAutoPageSpeed = "mangaAutoPageSpeed" const val mangaAutoPageSpeed = "mangaAutoPageSpeed"
const val mangaFooterConfig = "mangaFooterConfig" const val mangaFooterConfig = "mangaFooterConfig"
const val singlePageScroll = "singlePageScroll"
const val disableClickScroll = "disableClickScroll" const val disableClickScroll = "disableClickScroll"
const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll" const val enableMangaHorizontalScroll = "enableMangaHorizontalScroll"
const val autoRefresh = "auto_refresh" const val autoRefresh = "auto_refresh"
@@ -623,13 +623,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value) appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value)
} }
//单页滚动
var singlePageScroll
get() = appCtx.getPrefBoolean(PreferKey.singlePageScroll, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.singlePageScroll, value)
}
//点击翻页 //点击翻页
var disableClickScroll var disableClickScroll
get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false) get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false)
@@ -74,10 +74,10 @@ object ReadManga : CoroutineScope by MainScope() {
val book = book ?: return@execute val book = book ?: return@execute
book.lastCheckCount = 0 book.lastCheckCount = 0
book.durChapterTime = System.currentTimeMillis() book.durChapterTime = System.currentTimeMillis()
val chapterChanged = book.durChapterIndex != durChapterPagePos val changed = book.durChapterIndex != durChapterPagePos
book.durChapterIndex = durChapterPagePos book.durChapterIndex = durChapterPagePos
book.durChapterPos = durChapterPos book.durChapterPos = durChapterPos
if (!pageChanged || chapterChanged) { if (!pageChanged || changed) {
appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let { appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let {
book.durChapterTitle = it.getDisplayTitle( book.durChapterTitle = it.getDisplayTitle(
ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(), ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
@@ -209,6 +209,9 @@ object ReadManga : CoroutineScope by MainScope() {
fun loadContent( fun loadContent(
index: Int, index: Int,
) { ) {
if (chapterChanged) {
removeLoading(index)
}
if (addLoading(index)) { if (addLoading(index)) {
Coroutine.async { Coroutine.async {
val book = book!! val book = book!!
@@ -246,4 +246,14 @@ class MangaViewModel(application: Application) : BaseViewModel(application) {
super.onCleared() super.onCleared()
changeSourceCoroutine?.cancel() 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.KeyEvent
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
@@ -82,13 +80,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
private val mAdapter: MangaAdapter by lazy { private val mAdapter: MangaAdapter by lazy {
MangaAdapter(this@ReadMangaActivity) 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 { private val mSizeProvider by lazy {
FixedPreloadSizeProvider<Any>( 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 var mDisableAutoScrollPage = false
private val mInitMangaAutoPageSpeed by lazy { private val mInitMangaAutoPageSpeed by lazy {
@@ -201,7 +194,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
mLayoutManager.isItemPrefetchEnabled = true mLayoutManager.isItemPrefetchEnabled = true
setItemViewCacheSize(AppConfig.preDownloadNum) setItemViewCacheSize(AppConfig.preDownloadNum)
singlePagerScroller( singlePagerScroller(
AppConfig.singlePageScroll,
AppConfig.enableMangaHorizontalScroll AppConfig.enableMangaHorizontalScroll
) )
disabledClickScroller(AppConfig.disableClickScroll) 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 -> { R.id.menu_pre_manga_number -> {
showNumberPickerDialog( showNumberPickerDialog(
0, 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 -> { R.id.menu_disable_manga_scale -> {
item.isChecked = !item.isChecked item.isChecked = !item.isChecked
AppConfig.disableMangaScale = item.isChecked AppConfig.disableMangaScale = item.isChecked
@@ -535,7 +528,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
AppConfig.enableMangaHorizontalScroll = item.isChecked AppConfig.enableMangaHorizontalScroll = item.isChecked
mLayoutManager.orientation = mLayoutManager.orientation =
if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL if (item.isChecked) LinearLayoutManager.HORIZONTAL else LinearLayoutManager.VERTICAL
singlePagerScroller(AppConfig.singlePageScroll, item.isChecked) singlePagerScroller(item.isChecked)
mAdapter.isHorizontal = item.isChecked mAdapter.isHorizontal = item.isChecked
mAdapter.notifyItemRangeChanged( mAdapter.notifyItemRangeChanged(
ReadManga.durChapterPos.minus(2), ReadManga.durChapterPos.minus(2),
@@ -587,26 +580,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!) binding.mRecyclerMange.addOnScrollListener(mRecyclerViewPreloader!!)
} }
private fun singlePagerScroller(enableSingleScroll: Boolean, enableHorizontalScroll: Boolean) { private fun singlePagerScroller(enableHorizontalScroll: Boolean) {
if (enableSingleScroll) { if (enableHorizontalScroll) {
mPagerSnapHelper?.attachToRecyclerView(null) mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerMange)
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 { } else {
mPagerSnapHelper?.attachToRecyclerView(null) mPagerSnapHelper.attachToRecyclerView(null)
} }
} }
@@ -615,7 +593,6 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
this.mMenu = menu this.mMenu = menu
menu.findItem(R.id.menu_pre_manga_number).title = menu.findItem(R.id.menu_pre_manga_number).title =
getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum) 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_manga_scale).isChecked = AppConfig.disableMangaScale
menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroll menu.findItem(R.id.menu_disable_click_scroller).isChecked = AppConfig.disableClickScroll
menu.findItem(R.id.menu_manga_auto_page_speed).title = menu.findItem(R.id.menu_manga_auto_page_speed).title =
@@ -646,34 +623,35 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, MangaViewModel>()
} }
private fun scrollToNext() { private fun scrollToNext() {
val lastCompletelyVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition() if (binding.mRecyclerMange.isAtBottom()) {
val nextPosition = if (lastCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
lastCompletelyVisiblePosition + 1
} else {
mLayoutManager.findFirstVisibleItemPosition() + 1
}
if (nextPosition > mAdapter.getCurrentList().lastIndex) {
return 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() { private fun scrollToPrev() {
val firstCompletelyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition() if (binding.mRecyclerMange.isAtTop()) {
val prevPosition = if (firstCompletelyVisiblePosition != RecyclerView.NO_POSITION) {
firstCompletelyVisiblePosition - 1
} else {
mLayoutManager.findFirstVisibleItemPosition() - 1
}
if (prevPosition < 0) {
return return
} }
smoothScrollToPosition(prevPosition) val (dx, dy) = if (AppConfig.enableMangaHorizontalScroll) {
} val width =
binding.mRecyclerMange.width - binding.mRecyclerMange.paddingStart - binding.mRecyclerMange.paddingEnd
private fun smoothScrollToPosition(position: Int) { Pair(width, 0)
mSmoothScroller.targetPosition = position } else {
mLayoutManager.startSmoothScroll(mSmoothScroller) val height =
binding.mRecyclerMange.height - binding.mRecyclerMange.paddingTop - binding.mRecyclerMange.paddingBottom
Pair(0, height)
}
binding.mRecyclerMange.smoothScrollBy(-dx, -dy, null)
} }
private fun startAutoPage() { 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" android:title="@string/change_origin"
app:showAsAction="always" /> app:showAsAction="always" />
<item
android:id="@+id/menu_refresh"
android:icon="@drawable/ic_refresh_black_24dp"
android:title="@string/refresh"
app:showAsAction="always" />
<item <item
android:id="@+id/menu_catalog" android:id="@+id/menu_catalog"
android:icon="@drawable/ic_toc" android:icon="@drawable/ic_toc"
@@ -24,13 +30,6 @@
android:title="@string/pre_download" android:title="@string/pre_download"
app:showAsAction="never" /> 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 <item
android:id="@+id/menu_disable_manga_scale" android:id="@+id/menu_disable_manga_scale"
android:checkable="true" android:checkable="true"
@@ -821,7 +821,6 @@
<string name="import_bookshelf">Importar lista de libros</string> <string name="import_bookshelf">Importar lista de libros</string>
<string name="pre_download">Descarga anterior</string> <string name="pre_download">Descarga anterior</string>
<string name="pre_download_m">预下载%s页</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="pre_download_s">Descargue %s capítulos antes</string>
<string name="is_enabled">Está habilitado</string> <string name="is_enabled">Está habilitado</string>
<string name="background_image">Imagen de fondo</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="import_bookshelf">Import the list of books</string>
<string name="pre_download">Download in advance</string> <string name="pre_download">Download in advance</string>
<string name="pre_download_m">预下载%s页</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="pre_download_s">Download %s chapters in advance</string>
<string name="is_enabled">Is enabled</string> <string name="is_enabled">Is enabled</string>
<string name="background_image">Background image</string> <string name="background_image">Background image</string>
@@ -822,7 +822,6 @@
<string name="import_bookshelf">Importar a lista de livros</string> <string name="import_bookshelf">Importar a lista de livros</string>
<string name="pre_download">Baixar antecipadamente</string> <string name="pre_download">Baixar antecipadamente</string>
<string name="pre_download_m">预下载%s页</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="pre_download_s">Baixar %s capítulos antecipadamente</string>
<string name="is_enabled">Está ativado</string> <string name="is_enabled">Está ativado</string>
<string name="background_image">Imagem de fundo</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="import_bookshelf">Nhập bookshelf</string>
<string name="pre_download">Tải xuống trước</string> <string name="pre_download">Tải xuống trước</string>
<string name="pre_download_m">预下载%s页</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="pre_download_s">Tải xuống trước %s chương</string>
<string name="is_enabled">Đã bật</string> <string name="is_enabled">Đã bật</string>
<string name="background_image">Ảnh nền</string> <string name="background_image">Ảnh nền</string>
@@ -822,7 +822,6 @@
<string name="import_bookshelf">導入書單</string> <string name="import_bookshelf">導入書單</string>
<string name="pre_download">預下載</string> <string name="pre_download">預下載</string>
<string name="pre_download_m">預下載%s页</string> <string name="pre_download_m">預下載%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">預先下載%s章正文</string> <string name="pre_download_s">預先下載%s章正文</string>
<string name="is_enabled">係咪啟用</string> <string name="is_enabled">係咪啟用</string>
<string name="background_image">背景圖片</string> <string name="background_image">背景圖片</string>
@@ -825,7 +825,6 @@
<string name="import_bookshelf">匯入書單</string> <string name="import_bookshelf">匯入書單</string>
<string name="pre_download">預下載</string> <string name="pre_download">預下載</string>
<string name="pre_download_m">预下载%s页</string> <string name="pre_download_m">预下载%s页</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_s">預先下載%s章正文</string> <string name="pre_download_s">預先下載%s章正文</string>
<string name="is_enabled">是否啟用</string> <string name="is_enabled">是否啟用</string>
<string name="background_image">背景圖片</string> <string name="background_image">背景圖片</string>
-1
View File
@@ -827,7 +827,6 @@
<string name="export_bookshelf">导出书单</string> <string name="export_bookshelf">导出书单</string>
<string name="import_bookshelf">导入书单</string> <string name="import_bookshelf">导入书单</string>
<string name="pre_download">预下载</string> <string name="pre_download">预下载</string>
<string name="single_page_scroller">单页滚动</string>
<string name="pre_download_m">预下载%s页</string> <string name="pre_download_m">预下载%s页</string>
<string name="pre_download_s">预先下载 %s 章正文</string> <string name="pre_download_s">预先下载 %s 章正文</string>
<string name="is_enabled">是否启用</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="import_bookshelf">Import the list of books</string>
<string name="pre_download">Download in advance</string> <string name="pre_download">Download in advance</string>
<string name="pre_download_m">Pre-download %s pages</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="pre_download_s">Download %s chapters in advance</string>
<string name="is_enabled">Is enabled</string> <string name="is_enabled">Is enabled</string>
<string name="background_image">Background image</string> <string name="background_image">Background image</string>