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 bfcdc2f84..cd7beed6c 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 @@ -107,10 +107,10 @@ fun ReaderScreen(info: BaseGalleryInfo, page: Int = -1, navigator: DestinationsN val lazyListState = rememberLazyListState() val pagerState = rememberPagerState { pageLoader.size } val syncState = rememberSliderPagerDoubleSyncState(lazyListState, pagerState, pageLoader) - syncState.Sync(ReadingModeType.isWebtoon(readingMode)) Box { var appbarVisible by remember { mutableStateOf(false) } val bgColor by collectBackgroundColorAsState() + syncState.Sync(ReadingModeType.isWebtoon(readingMode)) { appbarVisible = false } if (fullscreen) { LaunchedEffect(Unit) { snapshotFlow { appbarVisible }.collect { 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 926f10b2d..283450433 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 @@ -8,12 +8,11 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow -import com.hippo.ehviewer.Settings import com.hippo.ehviewer.gallery.PageLoader2 -import kotlin.math.absoluteValue import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.filterNotNull @@ -23,8 +22,7 @@ class SliderPagerDoubleSync( private val pagerState: PagerState, private val pageLoader: PageLoader2, ) { - private var requestScroll = true - private var sliderFollowPager = true + private var sliderFollowPager by mutableStateOf(false) var sliderValue by mutableIntStateOf(pageLoader.startPage + 1) private set @@ -34,12 +32,12 @@ class SliderPagerDoubleSync( } @Composable - fun Sync(webtoon: Boolean) { + fun Sync(webtoon: Boolean, onPageSelected: () -> Unit) { val fling by lazyListState.interactionSource.collectIsDraggedAsState() val pagerFling by pagerState.interactionSource.collectIsDraggedAsState() if (fling || pagerFling) sliderFollowPager = true val currentIndexFlow = remember(webtoon) { - requestScroll = true + sliderFollowPager = false if (webtoon) { snapshotFlow { with(lazyListState.layoutInfo) { @@ -52,41 +50,24 @@ class SliderPagerDoubleSync( snapshotFlow { pagerState.currentPage } } } - LaunchedEffect(currentIndexFlow) { - currentIndexFlow.collect { index -> - if (sliderFollowPager && !requestScroll) { + if (sliderFollowPager) { + LaunchedEffect(currentIndexFlow) { + currentIndexFlow.collect { index -> sliderValue = index + 1 pageLoader.startPage = index + onPageSelected() } } - } - LaunchedEffect(webtoon) { - snapshotFlow { sliderValue - 1 }.collectLatest { index -> - if (sliderFollowPager && !requestScroll) return@collectLatest - if (webtoon) { - if (requestScroll) { - lazyListState.requestScrollToItem(index) - requestScroll = false + } else { + LaunchedEffect(webtoon) { + snapshotFlow { sliderValue - 1 }.collectLatest { index -> + if (webtoon) { + lazyListState.scrollToItem(index) } else { - if (smoothScroll((index - lazyListState.firstVisibleItemIndex))) { - lazyListState.animateScrollToItem(index) - } else { - lazyListState.scrollToItem(index) - } - } - } else { - if (requestScroll) { - pagerState.requestScrollToPage(index) - requestScroll = false - } else { - if (smoothScroll((index - pagerState.currentPage))) { - pagerState.animateScrollToPage(index) - } else { - pagerState.scrollToPage(index) - } + pagerState.animateScrollToPage(index) } + pageLoader.startPage = index } - pageLoader.startPage = index } } } @@ -101,8 +82,3 @@ fun rememberSliderPagerDoubleSyncState( ): SliderPagerDoubleSync = remember { SliderPagerDoubleSync(lazyListState, pagerState, pageLoader) } - -private fun smoothScroll(distance: Int) = - distance.absoluteValue < SMOOTH_SCROLL_THRESHOLD && Settings.pageTransitions.value - -private const val SMOOTH_SCROLL_THRESHOLD = 50