HapeLee преди 1 месец
родител
ревизия
c8dc68842a

+ 11 - 25
app/src/main/java/io/legado/app/ui/widget/components/button/series/MediumToggleButton.kt

@@ -1,10 +1,7 @@
 package io.legado.app.ui.widget.components.button.series
 
-import androidx.compose.animation.animateColorAsState
-import androidx.compose.animation.core.tween
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.unit.dp
@@ -23,24 +20,6 @@ fun MediumToggleButton(
     text: String? = null,
     contentDescription: String? = null
 ) {
-    val containerColor by animateColorAsState(
-        targetValue = if (checked) {
-            LegadoTheme.colorScheme.primaryContainer
-        } else {
-            LegadoTheme.colorScheme.surfaceContainer
-        },
-        animationSpec = tween(150),
-        label = "MediumToggleContainerColor"
-    )
-    val contentColor by animateColorAsState(
-        targetValue = if (checked) {
-            LegadoTheme.colorScheme.onPrimaryContainer
-        } else {
-            LegadoTheme.colorScheme.onSurfaceVariant
-        },
-        animationSpec = tween(150),
-        label = "MediumToggleContentColor"
-    )
     SeriesButton(
         onClick = { onCheckedChange(!checked) },
         modifier = modifier,
@@ -52,10 +31,17 @@ fun MediumToggleButton(
             ToggleStyle.Outlined -> SeriesIconButtonStyle.Outlined
             ToggleStyle.Tonal -> SeriesIconButtonStyle.Tonal
         },
-        containerColor = containerColor,
-        selectedContainerColor = containerColor,
-        contentColor = contentColor,
-        selectedContentColor = contentColor
+        // Outlined 未选中态留空,交给样式解析成透明容器
+        containerColor = if (style == ToggleStyle.Tonal) {
+            LegadoTheme.colorScheme.surfaceContainer
+        } else {
+            null
+        },
+        contentColor = LegadoTheme.colorScheme.onSurfaceVariant,
+        // M3E 实心 toggle 选中态:反色容器,背景与描边用 inverseSurface,内容用 inverseOnSurface
+        selectedContainerColor = LegadoTheme.colorScheme.inverseSurface,
+        selectedContentColor = LegadoTheme.colorScheme.inverseOnSurface,
+        selectedBorderColor = LegadoTheme.colorScheme.inverseSurface
     ) { resolvedContentColor ->
         SeriesButtonContent(
             icon = if (checked) (iconChecked ?: icon)!! else icon!!,

+ 8 - 1
app/src/main/java/io/legado/app/ui/widget/components/button/series/SeriesIconButton.kt

@@ -33,6 +33,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.selected
@@ -78,6 +79,7 @@ internal fun SeriesButton(
     containerColor: Color? = null,
     selectedContainerColor: Color = LegadoTheme.colorScheme.primaryContainer,
     selectedContentColor: Color = LegadoTheme.colorScheme.onPrimaryContainer,
+    selectedBorderColor: Color? = null,
     content: @Composable (Color) -> Unit
 ) {
     var lastEnabled by remember { mutableStateOf(enabled) }
@@ -109,7 +111,12 @@ internal fun SeriesButton(
         animationSpec = animSpec,
         label = "SeriesIconContentColor"
     )
-    val border = borderStroke(style, enabled)
+    // 描边只由 style 决定,选中态仅覆盖颜色,因此 Tonal 不会凭空多出描边
+    val border = if (enabled && selected && selectedBorderColor != null) {
+        borderStroke(style, enabled)?.copy(brush = SolidColor(selectedBorderColor))
+    } else {
+        borderStroke(style, enabled)
+    }
     val interactionSource = remember { MutableInteractionSource() }
 
     Box(

+ 11 - 17
app/src/main/java/io/legado/app/ui/widget/components/button/series/SmallToggleButton.kt

@@ -1,10 +1,7 @@
 package io.legado.app.ui.widget.components.button.series
 
-import androidx.compose.animation.animateColorAsState
-import androidx.compose.animation.core.tween
 import androidx.compose.foundation.layout.PaddingValues
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.unit.dp
@@ -25,16 +22,6 @@ fun SmallToggleButton(
     text: String? = null,
     contentDescription: String? = null
 ) {
-    val containerColor by animateColorAsState(
-        targetValue = if (checked) LegadoTheme.colorScheme.primaryContainer else LegadoTheme.colorScheme.surfaceContainer,
-        animationSpec = tween(150),
-        label = "SmallToggleContainerColor"
-    )
-    val iconTint by animateColorAsState(
-        targetValue = if (checked) LegadoTheme.colorScheme.onPrimaryContainer else LegadoTheme.colorScheme.onSurfaceVariant,
-        animationSpec = tween(150),
-        label = "SmallToggleIconTint"
-    )
     SeriesButton(
         onClick = { onCheckedChange(!checked) },
         modifier = modifier,
@@ -48,10 +35,17 @@ fun SmallToggleButton(
             ToggleStyle.Outlined -> SeriesIconButtonStyle.Outlined
             ToggleStyle.Tonal -> SeriesIconButtonStyle.Tonal
         },
-        containerColor = containerColor,
-        selectedContainerColor = containerColor,
-        contentColor = iconTint,
-        selectedContentColor = iconTint
+        // Outlined 未选中态留空,交给样式解析成透明容器
+        containerColor = if (style == ToggleStyle.Tonal) {
+            LegadoTheme.colorScheme.surfaceContainer
+        } else {
+            null
+        },
+        contentColor = LegadoTheme.colorScheme.onSurfaceVariant,
+        // M3E 实心 toggle 选中态:反色容器,背景与描边用 inverseSurface,内容用 inverseOnSurface
+        selectedContainerColor = LegadoTheme.colorScheme.inverseSurface,
+        selectedContentColor = LegadoTheme.colorScheme.inverseOnSurface,
+        selectedBorderColor = LegadoTheme.colorScheme.inverseSurface
     ) { contentColor ->
         SeriesButtonContent(
             icon = if (checked) (iconChecked ?: icon)!! else icon!!,