增加刷新,修复切换章节 (#4784)
* 调整页脚章节标题位置 * 修复章节切换问题 * 增加刷新 * 调整屏幕滚动问题 * ... * 修复图片过长滚动问题 * ...
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user