diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt index fdd47f57b..a1756a9b5 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/ReaderScreen.kt @@ -78,6 +78,7 @@ fun ReaderScreen(info: BaseGalleryInfo, page: Int = -1) { } val showSeekbar by Settings.showReaderSeekbar.collectAsState() val readingMode by Settings.readingMode.collectAsState { ReadingModeType.fromPreference(it) } + val defaultError = stringResource(id = R.string.decode_image_error) Deferred({ pageLoader.awaitReady() }) { val lazyListState = rememberLazyListState() val pagerState = rememberPagerState { pageLoader.size } @@ -134,7 +135,11 @@ fun ReaderScreen(info: BaseGalleryInfo, page: Int = -1) { painter = painter, contentDescription = null, modifier = Modifier.fillMaxWidth(), - contentScale = ContentScale.FillWidth, + contentScale = if (readingMode == ReadingModeType.VERTICAL) { + ContentScale.Fit + } else { + ContentScale.FillWidth + }, ) } ERROR -> { @@ -143,7 +148,7 @@ fun ReaderScreen(info: BaseGalleryInfo, page: Int = -1) { modifier = Modifier.align(Companion.Center), horizontalAlignment = Alignment.CenterHorizontally, ) { - Text(text = page.errorMsg.orEmpty()) + Text(text = page.errorMsg ?: defaultError) Button(onClick = { }) { Text(text = stringResource(id = R.string.action_retry)) } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SliderPagerDoubleSync.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SliderPagerDoubleSync.kt index 5d19cb1cb..c4dce7fd4 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SliderPagerDoubleSync.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/SliderPagerDoubleSync.kt @@ -13,6 +13,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import com.hippo.ehviewer.gallery.PageLoader2 +import kotlin.math.absoluteValue import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.mapNotNull @@ -41,7 +42,9 @@ class SliderPagerDoubleSync( snapshotFlow { lazyListState.layoutInfo }.mapNotNull { info -> - info.visibleItemsInfo.lastOrNull() + info.visibleItemsInfo.lastOrNull { + it.offset <= maxOf(info.viewportStartOffset, info.viewportEndOffset - it.size) + } }.collect { info -> sliderValue = info.index + 1 pageLoader.startPage = info.index @@ -49,24 +52,30 @@ class SliderPagerDoubleSync( } LaunchedEffect(Unit) { snapshotFlow { - pagerState.layoutInfo - }.mapNotNull { info -> - info.visiblePagesInfo.lastOrNull() - }.collect { info -> - sliderValue = info.index + 1 - pageLoader.startPage = info.index + pagerState.currentPage + }.collect { index -> + sliderValue = index + 1 + pageLoader.startPage = index } } } else { LaunchedEffect(Unit) { snapshotFlow { sliderValue - 1 }.collectLatest { index -> - pagerState.animateScrollToPage(index) + if ((index - pagerState.currentPage).absoluteValue > SMOOTH_SCROLL_THRESHOLD) { + pagerState.scrollToPage(index) + } else { + pagerState.animateScrollToPage(index) + } pageLoader.startPage = index } } LaunchedEffect(Unit) { snapshotFlow { sliderValue - 1 }.collectLatest { index -> - lazyListState.animateScrollToItem(index) + if ((index - lazyListState.firstVisibleItemIndex).absoluteValue > SMOOTH_SCROLL_THRESHOLD) { + lazyListState.scrollToItem(index) + } else { + lazyListState.animateScrollToItem(index) + } pageLoader.startPage = index } } @@ -91,3 +100,5 @@ fun rememberSliderPagerDoubleSyncState( SliderPagerDoubleSync(lazyListState, pagerState, pageLoader) } } + +private const val SMOOTH_SCROLL_THRESHOLD = 50