refactor: 主题色板和深色模式选择器形状优化

This commit is contained in:
Super12138 2026-02-09 08:54:59 +08:00
parent 8a3c9b2ff4
commit e5601df0b5
5 changed files with 37 additions and 5 deletions

View file

@ -38,7 +38,7 @@ android {
applicationId = "cn.super12138.todo" applicationId = "cn.super12138.todo"
minSdk = 24 minSdk = 24
targetSdk = 36 targetSdk = 36
versionCode = 988 versionCode = 989
versionName = "2.3.3" versionName = "2.3.3"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

View file

@ -5,16 +5,21 @@ import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material3.ButtonShapes
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@ -23,24 +28,34 @@ import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun DarkModeItem( fun DarkModeItem(
modifier: Modifier = Modifier,
@DrawableRes iconRes: Int, @DrawableRes iconRes: Int,
name: String, name: String,
contentColor: Color, contentColor: Color,
containerColor: Color, containerColor: Color,
selected: Boolean, selected: Boolean,
onSelect: () -> Unit, onSelect: () -> Unit,
modifier: Modifier = Modifier shapes: ButtonShapes = TodoDefaults.shapes()
) { ) {
val view = LocalView.current val view = LocalView.current
val interactionSource = remember { MutableInteractionSource() }
val pressed by interactionSource.collectIsPressedAsState()
val animatedShape = shapeByInteraction(shapes, pressed, TodoDefaults.shapesDefaultAnimationSpec)
val borderWidth by animateDpAsState(if (selected) 3.dp else (-1).dp) val borderWidth by animateDpAsState(if (selected) 3.dp else (-1).dp)
Column( Column(
modifier = modifier modifier = modifier
.clip(MaterialTheme.shapes.large) .clip(animatedShape)
.clickable( .clickable(
interactionSource = interactionSource,
role = Role.Button, role = Role.Button,
onClick = { onClick = {
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)

View file

@ -3,6 +3,7 @@ package cn.super12138.todo.ui.pages.settings.components.appearance.darkmode
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -16,6 +17,7 @@ import cn.super12138.todo.logic.model.DarkMode
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun DarkModePicker( fun DarkModePicker(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,

View file

@ -5,6 +5,8 @@ import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -14,10 +16,13 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material3.ButtonShapes
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@ -30,26 +35,34 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastForEach
import cn.super12138.todo.logic.model.ContrastLevel import cn.super12138.todo.logic.model.ContrastLevel
import cn.super12138.todo.logic.model.PaletteStyle import cn.super12138.todo.logic.model.PaletteStyle
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.theme.dynamicColorScheme import cn.super12138.todo.ui.theme.dynamicColorScheme
import cn.super12138.todo.ui.theme.shapeByInteraction
import cn.super12138.todo.utils.VibrationUtils import cn.super12138.todo.utils.VibrationUtils
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun PaletteItem( fun PaletteItem(
modifier: Modifier = Modifier,
isDynamicColor: Boolean, isDynamicColor: Boolean,
isDark: Boolean, isDark: Boolean,
paletteStyle: PaletteStyle, paletteStyle: PaletteStyle,
contrastLevel: ContrastLevel, contrastLevel: ContrastLevel,
selected: Boolean, selected: Boolean,
onSelect: () -> Unit, onSelect: () -> Unit,
modifier: Modifier = Modifier shapes: ButtonShapes = TodoDefaults.shapes()
) { ) {
val view = LocalView.current val view = LocalView.current
val interactionSource = remember { MutableInteractionSource() }
val pressed by interactionSource.collectIsPressedAsState()
val animatedShape = shapeByInteraction(shapes, pressed, TodoDefaults.shapesDefaultAnimationSpec)
Column( Column(
modifier = modifier modifier = modifier
.width(90.dp) .width(90.dp)
.clip(MaterialTheme.shapes.large) .clip(animatedShape)
.clickable( .clickable(
interactionSource = interactionSource,
role = Role.Button, role = Role.Button,
onClick = { onClick = {
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)

View file

@ -3,6 +3,7 @@ package cn.super12138.todo.ui.pages.settings.components.appearance.palette
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -17,6 +18,7 @@ import cn.super12138.todo.logic.model.PaletteStyle
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem import cn.super12138.todo.ui.pages.settings.components.LazyRowSettingsItem
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun PalettePicker( fun PalettePicker(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,