Просмотр исходного кода

Merge pull request #1460 from fansangg/fix/read-sheet-animation

fix:修复二级菜单手势滑动高度变化滞后与Tab高亮闪烁问题
Kudomaga 4 месяцев назад
Родитель
Сommit
4fde660a23

+ 15 - 5
app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt

@@ -87,6 +87,7 @@ internal fun HeaderFooterPage(
     )
     val pagerState = rememberPagerState(pageCount = { 3 })
     var selectedTab by remember { mutableIntStateOf(0) }
+    var clickScrollCount by remember { mutableIntStateOf(0) }
 
     val pageHeights = remember { mutableStateMapOf<Int, Int>() }
     val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
@@ -183,7 +184,11 @@ internal fun HeaderFooterPage(
     }
 
     LaunchedEffect(pagerState) {
-        snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
+        snapshotFlow { pagerState.currentPage }.collect { page ->
+            if (clickScrollCount == 0) {
+                selectedTab = page
+            }
+        }
     }
 
     Column(
@@ -195,11 +200,16 @@ internal fun HeaderFooterPage(
             selectedTabIndex = selectedTab,
             onTabSelected = { index ->
                 selectedTab = index
+                clickScrollCount++
                 scope.launch {
-                    pagerState.animateScrollToPage(
-                        page = index,
-                        animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
-                    )
+                    try {
+                        pagerState.animateScrollToPage(
+                            page = index,
+                            animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
+                        )
+                    } finally {
+                        clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
+                    }
                 }
             },
             modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),

+ 15 - 5
app/src/main/java/io/legado/app/ui/book/read/sheet/SystemMenuPage.kt

@@ -108,6 +108,7 @@ internal fun SystemMenuPage(
     val scope = rememberCoroutineScope()
     val pagerState = rememberPagerState(pageCount = { 3 })
     var selectedTab by remember { mutableIntStateOf(0) }
+    var clickScrollCount by remember { mutableIntStateOf(0) }
 
     val pageHeights = remember { mutableStateMapOf<Int, Int>() }
     val animatedHeight by rememberPagerAnimatedHeight(pagerState, pageHeights)
@@ -119,7 +120,11 @@ internal fun SystemMenuPage(
     var showIconSheet by remember { mutableStateOf(false) }
 
     LaunchedEffect(pagerState) {
-        snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
+        snapshotFlow { pagerState.currentPage }.collect { page ->
+            if (clickScrollCount == 0) {
+                selectedTab = page
+            }
+        }
     }
 
     Column(
@@ -135,11 +140,16 @@ internal fun SystemMenuPage(
             selectedTabIndex = selectedTab,
             onTabSelected = { index ->
                 selectedTab = index
+                clickScrollCount++
                 scope.launch {
-                    pagerState.animateScrollToPage(
-                        page = index,
-                        animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
-                    )
+                    try {
+                        pagerState.animateScrollToPage(
+                            page = index,
+                            animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
+                        )
+                    } finally {
+                        clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
+                    }
                 }
             },
             modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 8.dp),

+ 43 - 33
app/src/main/java/io/legado/app/ui/book/read/sheet/TextTitleSheet.kt

@@ -79,9 +79,14 @@ fun ReadStyleTextTitleContent(
     )
     val pagerState = rememberPagerState(pageCount = { 3 })
     var selectedTab by remember { mutableIntStateOf(0) }
+    var clickScrollCount by remember { mutableIntStateOf(0) }
 
     LaunchedEffect(pagerState) {
-        snapshotFlow { pagerState.settledPage }.collect { selectedTab = it }
+        snapshotFlow { pagerState.currentPage }.collect { page ->
+            if (clickScrollCount == 0) {
+                selectedTab = page
+            }
+        }
     }
 
     ReadStyleTextTitleContent(
@@ -95,11 +100,16 @@ fun ReadStyleTextTitleContent(
         onOpenTitleFontSelect = onOpenTitleFontSelect,
         animateToPage = { page ->
             selectedTab = page
+            clickScrollCount++
             scope.launch {
-                pagerState.animateScrollToPage(
-                    page = page,
-                    animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
-                )
+                try {
+                    pagerState.animateScrollToPage(
+                        page = page,
+                        animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing)
+                    )
+                } finally {
+                    clickScrollCount = (clickScrollCount - 1).coerceAtLeast(0)
+                }
             }
         },
         modifier = modifier,
@@ -144,25 +154,28 @@ internal fun ReadStyleTextTitleContent(
                 .clipToBounds()
                 .pagerHeight(animatedHeight),
         ) { page ->
-            val pageModifier = Modifier.onSizeChanged { size ->
-                pageHeights[page] = size.height
-            }
-            when (page) {
-                0 -> TextEffectsPage(
-                    onOpenShadowSet = onOpenShadowSet,
-                    onOpenUnderlineConfig = onOpenUnderlineConfig,
-                    onOpenHighlightRule = onOpenHighlightRule,
-                    onOpenFontSelect = onOpenFontSelect,
-                    modifier = pageModifier,
-                    onIntent = onIntent,
-                )
-
-                1 -> LayoutSpacingPage(modifier = pageModifier, onIntent = onIntent)
-                2 -> TitleSettingsPage(
-                    onOpenTitleFontSelect = onOpenTitleFontSelect,
-                    modifier = pageModifier,
-                    onIntent = onIntent,
-                )
+            Box(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .onSizeChanged { size ->
+                        pageHeights[page] = size.height
+                    }
+            ) {
+                when (page) {
+                    0 -> TextEffectsPage(
+                        onOpenShadowSet = onOpenShadowSet,
+                        onOpenUnderlineConfig = onOpenUnderlineConfig,
+                        onOpenHighlightRule = onOpenHighlightRule,
+                        onOpenFontSelect = onOpenFontSelect,
+                        onIntent = onIntent,
+                    )
+
+                    1 -> LayoutSpacingPage(onIntent = onIntent)
+                    2 -> TitleSettingsPage(
+                        onOpenTitleFontSelect = onOpenTitleFontSelect,
+                        onIntent = onIntent,
+                    )
+                }
             }
         }
     }
@@ -181,11 +194,10 @@ internal fun LayoutSpacingPage(
     var indentCount by remember { mutableIntStateOf(ReadBookConfig.paragraphIndent.length) }
 
     Column(
-        modifier = Modifier
+        modifier = modifier
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState())
-            .then(modifier),
+            .verticalScroll(rememberScrollState()),
     ) {
         Text(
             text = stringResource(R.string.read_config_body_spacing),
@@ -255,11 +267,10 @@ internal fun TextEffectsPage(
     var colorPickerInitial by remember { mutableIntStateOf(0) }
 
     Column(
-        modifier = Modifier
+        modifier = modifier
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState())
-            .then(modifier),
+            .verticalScroll(rememberScrollState()),
     ) {
         Text(
             text = stringResource(R.string.text_typeface),
@@ -421,11 +432,10 @@ internal fun TitleSettingsPage(
     )
 
     Column(
-        modifier = Modifier
+        modifier = modifier
             .fillMaxWidth()
             .padding(horizontal = 16.dp)
-            .verticalScroll(rememberScrollState())
-            .then(modifier),
+            .verticalScroll(rememberScrollState()),
     ) {
         TinyDropdownSettingItem(
             title = stringResource(R.string.body_title),