This commit is contained in:
Horis
2025-03-23 16:21:18 +08:00
parent 35cbb1fab8
commit 8c5c6242c6
2 changed files with 43 additions and 65 deletions
@@ -94,14 +94,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
PagerSnapHelper() PagerSnapHelper()
} }
private var isAutoScrollPage = false
private var isAutoScroll = false
private var mMangaAutoPageSpeed = AppConfig.mangaAutoPageSpeed
private lateinit var mMangaFooterConfig: MangaFooterConfig private lateinit var mMangaFooterConfig: MangaFooterConfig
private val mLabelBuilder by lazy { StringBuilder() } private val mLabelBuilder by lazy { StringBuilder() }
private var mMenu: Menu? = null private var mMenu: Menu? = null
private var mRecyclerViewPreloader: RecyclerViewPreloader<Any>? = null private var mRecyclerViewPreloader: RecyclerViewPreloader<Any>? = null
@@ -113,11 +108,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
private var justInitData: Boolean = false private var justInitData: Boolean = false
private var syncDialog: AlertDialog? = null private var syncDialog: AlertDialog? = null
private val mScrollTimer by lazy { private val mScrollTimer by lazy {
ScrollTimer(this, binding.mRecyclerManga, lifecycleScope).apply { ScrollTimer(this, binding.recyclerView, lifecycleScope).apply {
setSpeed(AppConfig.mangaAutoPageSpeed) setSpeed(AppConfig.mangaAutoPageSpeed)
} }
} }
private var enableAutoPageScroll = false private var enableAutoScrollPage = false
private var enableAutoScroll = false private var enableAutoScroll = false
private val mLinearInterpolator by lazy { private val mLinearInterpolator by lazy {
LinearInterpolator() LinearInterpolator()
@@ -183,7 +178,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun observeLiveBus() { override fun observeLiveBus() {
observeEvent<MangaFooterConfig>(EventBus.UP_MANGA_CONFIG) { observeEvent<MangaFooterConfig>(EventBus.UP_MANGA_CONFIG) {
mMangaFooterConfig = it mMangaFooterConfig = it
val item = mAdapter.getItem(binding.mRecyclerManga.findCenterViewPosition()) val item = mAdapter.getItem(binding.recyclerView.findCenterViewPosition())
upInfoBar(item) upInfoBar(item)
} }
} }
@@ -194,14 +189,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
?: MangaColorFilterConfig() ?: MangaColorFilterConfig()
mAdapter.setMangaImageColorFilter(mangaColorFilter) mAdapter.setMangaImageColorFilter(mangaColorFilter)
setHorizontalScroll(AppConfig.enableMangaHorizontalScroll) setHorizontalScroll(AppConfig.enableMangaHorizontalScroll)
binding.mRecyclerManga.run { binding.recyclerView.run {
adapter = mAdapter adapter = mAdapter
itemAnimator = null itemAnimator = null
layoutManager = mLayoutManager layoutManager = mLayoutManager
setHasFixedSize(true) setHasFixedSize(true)
mLayoutManager.initialPrefetchItemCount = 4
mLayoutManager.isItemPrefetchEnabled = true
setItemViewCacheSize(AppConfig.preDownloadNum)
setDisableClickScroll(AppConfig.disableClickScroll) setDisableClickScroll(AppConfig.disableClickScroll)
setDisableMangaScale(AppConfig.disableMangaScale) setDisableMangaScale(AppConfig.disableMangaScale)
setRecyclerViewPreloader(AppConfig.mangaPreDownloadNum) setRecyclerViewPreloader(AppConfig.mangaPreDownloadNum)
@@ -353,10 +345,10 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
ReadManga.syncProgress({ progress -> sureNewProgress(progress) }) ReadManga.syncProgress({ progress -> sureNewProgress(progress) })
} }
} }
if (isAutoScrollPage) { if (enableAutoScrollPage) {
mScrollTimer.isEnabledPage = true mScrollTimer.isEnabledPage = true
} }
if (isAutoScroll) { if (enableAutoScroll) {
mScrollTimer.isEnabled = true mScrollTimer.isEnabled = true
} }
} }
@@ -426,11 +418,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
override fun scrollBy(distance: Int) { override fun scrollBy(distance: Int) {
if (binding.mRecyclerManga.isAtBottom()) { if (binding.recyclerView.isAtEnd()) {
return return
} }
val time = ceil(16f / distance * 10000).toInt() val time = ceil(16f / distance * 10000).toInt()
binding.mRecyclerManga.smoothScrollBy(10000, 10000, mLinearInterpolator, time) binding.recyclerView.smoothScrollBy(10000, 10000, mLinearInterpolator, time)
} }
override fun scrollPage() { override fun scrollPage() {
@@ -514,28 +506,23 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
R.id.menu_enable_auto_page -> { R.id.menu_enable_auto_page -> {
item.isChecked = !item.isChecked item.isChecked = !item.isChecked
val menuMangaAutoPageSpeed = mMenu?.findItem(R.id.menu_manga_auto_page_speed) val menuMangaAutoPageSpeed = mMenu?.findItem(R.id.menu_manga_auto_page_speed)
isAutoScrollPage = item.isChecked
mScrollTimer.isEnabledPage = item.isChecked mScrollTimer.isEnabledPage = item.isChecked
menuMangaAutoPageSpeed?.isVisible = item.isChecked menuMangaAutoPageSpeed?.isVisible = item.isChecked
enableAutoPageScroll = item.isChecked enableAutoScrollPage = item.isChecked
enableAutoScroll = false enableAutoScroll = false
mScrollTimer.isEnabled = false mScrollTimer.isEnabled = false
isAutoScroll = false
mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false mMenu?.findItem(R.id.menu_enable_auto_scroll)?.isChecked = false
} }
R.id.menu_manga_auto_page_speed -> { R.id.menu_manga_auto_page_speed -> {
val mangaAutoPage = mMenu?.findItem(R.id.menu_enable_auto_page)
// val mangaAutoScroll = mMenu?.findItem(R.id.menu_enable_auto_scroll)
showNumberPickerDialog( showNumberPickerDialog(
1, getString(R.string.setting_manga_auto_page_speed), 1, getString(R.string.setting_manga_auto_page_speed),
AppConfig.mangaAutoPageSpeed AppConfig.mangaAutoPageSpeed
) { ) {
AppConfig.mangaAutoPageSpeed = it AppConfig.mangaAutoPageSpeed = it
mMangaAutoPageSpeed = it
item.title = getString(R.string.manga_auto_page_speed, it) item.title = getString(R.string.manga_auto_page_speed, it)
mScrollTimer.setSpeed(it) mScrollTimer.setSpeed(it)
if (mangaAutoPage?.isChecked == true) { if (enableAutoScrollPage) {
mScrollTimer.isEnabledPage = true mScrollTimer.isEnabledPage = true
} }
} }
@@ -562,12 +549,14 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
mScrollTimer.isEnabled = item.isChecked mScrollTimer.isEnabled = item.isChecked
mMenu?.findItem(R.id.menu_enable_auto_page)?.isChecked = false mMenu?.findItem(R.id.menu_enable_auto_page)?.isChecked = false
enableAutoScroll = item.isChecked enableAutoScroll = item.isChecked
enableAutoPageScroll = false enableAutoScrollPage = false
isAutoScrollPage = false
isAutoScroll = item.isChecked
mScrollTimer.isEnabledPage = false mScrollTimer.isEnabledPage = false
mMenu?.findItem(R.id.menu_manga_auto_page_speed)?.isVisible = item.isChecked mMenu?.findItem(R.id.menu_manga_auto_page_speed)?.isVisible = item.isChecked
mPagerSnapHelper.attachToRecyclerView(null) if (enableAutoScroll) {
mPagerSnapHelper.attachToRecyclerView(null)
} else if (AppConfig.enableMangaHorizontalScroll) {
mPagerSnapHelper.attachToRecyclerView(binding.recyclerView)
}
} }
} }
return super.onCompatOptionsItemSelected(item) return super.onCompatOptionsItemSelected(item)
@@ -587,7 +576,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
if (enableAutoScroll) { if (enableAutoScroll) {
mScrollTimer.isEnabled = !menuIsVisible mScrollTimer.isEnabled = !menuIsVisible
} }
if (enableAutoPageScroll) { if (enableAutoScrollPage) {
mScrollTimer.isEnabledPage = !menuIsVisible mScrollTimer.isEnabledPage = !menuIsVisible
} }
} }
@@ -612,19 +601,19 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
private fun setRecyclerViewPreloader(maxPreload: Int) { private fun setRecyclerViewPreloader(maxPreload: Int) {
if (mRecyclerViewPreloader != null) { if (mRecyclerViewPreloader != null) {
binding.mRecyclerManga.removeOnScrollListener(mRecyclerViewPreloader!!) binding.recyclerView.removeOnScrollListener(mRecyclerViewPreloader!!)
} }
mRecyclerViewPreloader = RecyclerViewPreloader( mRecyclerViewPreloader = RecyclerViewPreloader(
Glide.with(this), mAdapter, mSizeProvider, maxPreload Glide.with(this), mAdapter, mSizeProvider, maxPreload
) )
binding.mRecyclerManga.addOnScrollListener(mRecyclerViewPreloader!!) binding.recyclerView.addOnScrollListener(mRecyclerViewPreloader!!)
} }
private fun setHorizontalScroll(enable: Boolean) { private fun setHorizontalScroll(enable: Boolean) {
mAdapter.isHorizontal = enable mAdapter.isHorizontal = enable
if (enable) { if (enable) {
if (!enableAutoScroll) { if (!enableAutoScroll) {
mPagerSnapHelper.attachToRecyclerView(binding.mRecyclerManga) mPagerSnapHelper.attachToRecyclerView(binding.recyclerView)
} }
mLayoutManager.orientation = LinearLayoutManager.HORIZONTAL mLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
} else { } else {
@@ -641,16 +630,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
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_scroll).isChecked = AppConfig.disableClickScroll menu.findItem(R.id.menu_disable_click_scroll).isChecked = AppConfig.disableClickScroll
menu.findItem(R.id.menu_manga_auto_page_speed).title = menu.findItem(R.id.menu_manga_auto_page_speed).title =
getString(R.string.manga_auto_page_speed, mMangaAutoPageSpeed) getString(R.string.manga_auto_page_speed, AppConfig.mangaAutoPageSpeed)
menu.findItem(R.id.menu_enable_horizontal_scroll).isChecked = menu.findItem(R.id.menu_enable_horizontal_scroll).isChecked =
AppConfig.enableMangaHorizontalScroll AppConfig.enableMangaHorizontalScroll
} }
private fun setDisableMangaScale(disable: Boolean) { private fun setDisableMangaScale(disable: Boolean) {
binding.webtoonFrame.disableMangaScale = disable binding.webtoonFrame.disableMangaScale = disable
binding.mRecyclerManga.disableMangaScale = disable binding.recyclerView.disableMangaScale = disable
if (disable) { if (disable) {
binding.mRecyclerManga.resetZoom() binding.recyclerView.resetZoom()
} }
} }
@@ -668,47 +657,39 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
private fun scrollToNext() { private fun scrollToNext() {
if (binding.mRecyclerManga.isAtBottom()) { if (binding.recyclerView.isAtEnd()) {
return return
} }
val dx: Int var dx = 0
val dy: Int var dy = 0
if (AppConfig.enableMangaHorizontalScroll) { if (AppConfig.enableMangaHorizontalScroll) {
val width = binding.mRecyclerManga.run { dx = binding.recyclerView.run {
width - paddingStart - paddingEnd width - paddingStart - paddingEnd
} }
dx = width
dy = 0
} else { } else {
val height = binding.mRecyclerManga.run { dy = binding.recyclerView.run {
height - paddingTop - paddingBottom height - paddingTop - paddingBottom
} }
dx = 0
dy = height
} }
binding.mRecyclerManga.smoothScrollBy(dx, dy) binding.recyclerView.smoothScrollBy(dx, dy)
} }
private fun scrollToPrev() { private fun scrollToPrev() {
if (binding.mRecyclerManga.isAtTop()) { if (binding.recyclerView.isAtStart()) {
return return
} }
val dx: Int var dx = 0
val dy: Int var dy = 0
if (AppConfig.enableMangaHorizontalScroll) { if (AppConfig.enableMangaHorizontalScroll) {
val width = binding.mRecyclerManga.run { dx = binding.recyclerView.run {
width - paddingStart - paddingEnd width - paddingStart - paddingEnd
} }
dx = width
dy = 0
} else { } else {
val height = binding.mRecyclerManga.run { dy = binding.recyclerView.run {
height - paddingTop - paddingBottom height - paddingTop - paddingBottom
} }
dx = 0
dy = height
} }
binding.mRecyclerManga.smoothScrollBy(-dx, -dy) binding.recyclerView.smoothScrollBy(-dx, -dy)
} }
private fun showNumberPickerDialog( private fun showNumberPickerDialog(
@@ -750,15 +731,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
} }
} }
private fun RecyclerView.isAtTop(): Boolean { private fun RecyclerView.isAtStart(): Boolean {
return (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) return !canScrollVertically(-1) && !canScrollHorizontally(-1)
&& !canScrollVertically(-1)
} }
private fun RecyclerView.isAtBottom(): Boolean { private fun RecyclerView.isAtEnd(): Boolean {
val adapter = adapter ?: return false return !canScrollVertically(1) && !canScrollHorizontally(1)
return (mLayoutManager.findLastCompletelyVisibleItemPosition() == adapter.itemCount - 1) &&
!canScrollVertically(1)
} }
fun updateWindowBrightness(brightness: Int) { fun updateWindowBrightness(brightness: Int) {
+4 -4
View File
@@ -6,12 +6,12 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<io.legado.app.ui.book.manga.recyclerview.WebtoonFrame <io.legado.app.ui.book.manga.recyclerview.WebtoonFrame
android:id="@+id/webtoonFrame" android:id="@+id/webtoon_frame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<io.legado.app.ui.book.manga.recyclerview.WebtoonRecyclerView <io.legado.app.ui.book.manga.recyclerview.WebtoonRecyclerView
android:id="@+id/mRecyclerManga" android:id="@+id/recycler_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
@@ -29,7 +29,7 @@
tools:visibility="visible" /> tools:visibility="visible" />
<io.legado.app.ui.book.read.MangaMenu <io.legado.app.ui.book.read.MangaMenu
android:id="@+id/mangaMenu" android:id="@+id/manga_menu"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:visibility="gone" android:visibility="gone"
@@ -64,7 +64,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:text="正在加载中..." android:text="@string/loading"
android:textColor="@color/primaryText" /> android:textColor="@color/primaryText" />
</LinearLayout> </LinearLayout>