选中态:今天=实心填充,非今天=描边圆,角标置顶不再被遮挡

之前所有选中态都是实心圆,描边圆只用于"今天未选中"。
现改为:今天+选中=primaryContainer 实心填充,普通日期+选中=primary 描边圆,
今天未选中维持细描边。
角标加 zIndex(1f) 提到最上,padding 收紧到 top=1/end=2 紧贴右上角方形空白,
配合描边圆改造,休/班角标在选中态下不再被圆形覆盖。
This commit is contained in:
meyou 2026-05-16 18:47:57 +08:00
parent aa223db519
commit 71a3cbc62a

View File

@ -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)
)
}
}