From 71a3cbc62a4d94b002174bfa72deee3abd79676e Mon Sep 17 00:00:00 2001 From: meyou <2636699780@qq.com> Date: Sat, 16 May 2026 18:47:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=89=E4=B8=AD=E6=80=81:=E4=BB=8A=E5=A4=A9?= =?UTF-8?q?=3D=E5=AE=9E=E5=BF=83=E5=A1=AB=E5=85=85,=E9=9D=9E=E4=BB=8A?= =?UTF-8?q?=E5=A4=A9=3D=E6=8F=8F=E8=BE=B9=E5=9C=86,=E8=A7=92=E6=A0=87?= =?UTF-8?q?=E7=BD=AE=E9=A1=B6=E4=B8=8D=E5=86=8D=E8=A2=AB=E9=81=AE=E6=8C=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前所有选中态都是实心圆,描边圆只用于"今天未选中"。 现改为:今天+选中=primaryContainer 实心填充,普通日期+选中=primary 描边圆, 今天未选中维持细描边。 角标加 zIndex(1f) 提到最上,padding 收紧到 top=1/end=2 紧贴右上角方形空白, 配合描边圆改造,休/班角标在选中态下不再被圆形覆盖。 --- .../kotlin/plus/rua/project/ui/DayCell.kt | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt b/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt index 90b6bcf..628c72a 100644 --- a/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt +++ b/shared/src/commonMain/kotlin/plus/rua/project/ui/DayCell.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.zIndex import com.tyme.solar.SolarDay import kotlinx.datetime.LocalDate @@ -84,24 +85,35 @@ fun DayCell( ) { state -> when (state) { DayCellState.SELECTED_TODAY -> MaterialTheme.colorScheme.onPrimaryContainer - DayCellState.SELECTED -> MaterialTheme.colorScheme.onPrimary + DayCellState.SELECTED -> MaterialTheme.colorScheme.primary DayCellState.TODAY -> MaterialTheme.colorScheme.primary DayCellState.OTHER_MONTH -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) DayCellState.NORMAL -> MaterialTheme.colorScheme.onSurface } } - val selectedColor by transition.animateColor( + // 选中今天:实心填充 primaryContainer;其他状态不填充。 + val selectedFillColor by transition.animateColor( transitionSpec = { tween(250, easing = FastOutSlowInEasing) }, - label = "selectedColor" + label = "selectedFillColor" ) { state -> when (state) { DayCellState.SELECTED_TODAY -> MaterialTheme.colorScheme.primaryContainer - DayCellState.SELECTED -> MaterialTheme.colorScheme.primary else -> Color.Transparent } } + // 选中非今天:绘制描边圆,避免遮挡右上角角标。 + val selectedOutlineAlpha by transition.animateFloat( + transitionSpec = { tween(250, easing = FastOutSlowInEasing) }, + label = "selectedOutlineAlpha" + ) { state -> + when (state) { + DayCellState.SELECTED -> 1f + else -> 0f + } + } + val borderAlpha by transition.animateFloat( transitionSpec = { tween(250, easing = FastOutSlowInEasing) }, label = "borderAlpha" @@ -113,6 +125,7 @@ fun DayCell( } val todayBorderColor = MaterialTheme.colorScheme.primary + val selectedOutlineColor = MaterialTheme.colorScheme.primary data class DayAnnotation(val text: String, val isHighlight: Boolean) @@ -163,7 +176,7 @@ fun DayCell( if (annotation.isHighlight) { when (state) { DayCellState.SELECTED_TODAY -> MaterialTheme.colorScheme.onPrimaryContainer.copy(alpha = 0.85f) - DayCellState.SELECTED -> MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.85f) + DayCellState.SELECTED -> MaterialTheme.colorScheme.error.copy(alpha = 0.7f) DayCellState.TODAY -> MaterialTheme.colorScheme.primary DayCellState.OTHER_MONTH -> MaterialTheme.colorScheme.error.copy(alpha = 0.35f) DayCellState.NORMAL -> MaterialTheme.colorScheme.error.copy(alpha = 0.7f) @@ -171,7 +184,7 @@ fun DayCell( } else { when (state) { DayCellState.SELECTED_TODAY -> MaterialTheme.colorScheme.onPrimaryContainer.copy(alpha = 0.7f) - DayCellState.SELECTED -> MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.7f) + DayCellState.SELECTED -> MaterialTheme.colorScheme.primary.copy(alpha = 0.7f) DayCellState.TODAY -> MaterialTheme.colorScheme.primary.copy(alpha = 0.6f) DayCellState.OTHER_MONTH -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.26f) DayCellState.NORMAL -> MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f) @@ -198,19 +211,29 @@ fun DayCell( } .clip(CircleShape) .drawBehind { - if (revealProgress > 0f) { - val maxRadius = size.minDimension / 2f + val maxRadius = size.minDimension / 2f + val center = Offset(size.width / 2f, size.height / 2f) + if (revealProgress > 0f && selectedFillColor.alpha > 0f) { drawCircle( - color = selectedColor, + color = selectedFillColor, radius = revealProgress * maxRadius, - center = Offset(size.width / 2f, size.height / 2f) + center = center + ) + } + if (revealProgress > 0f && selectedOutlineAlpha > 0f) { + val strokePx = 1.5.dp.toPx() + drawCircle( + color = selectedOutlineColor.copy(alpha = selectedOutlineAlpha), + radius = revealProgress * maxRadius - strokePx / 2f, + center = center, + style = Stroke(width = strokePx) ) } if (borderAlpha > 0f) { drawCircle( color = todayBorderColor.copy(alpha = borderAlpha.coerceAtMost(1f)), - radius = size.minDimension / 2f, - center = Offset(size.width / 2f, size.height / 2f), + radius = maxRadius, + center = center, style = Stroke(width = borderAlpha.coerceAtMost(1.5f) * 1.5.dp.toPx()) ) } @@ -247,7 +270,8 @@ fun DayCell( lineHeight = 9.sp, modifier = Modifier .align(Alignment.TopEnd) - .padding(top = 2.dp, end = 4.dp) + .zIndex(1f) + .padding(top = 1.dp, end = 2.dp) ) } }