修复点击"今天"按钮标题栏抖动:alpha 渐变替代条件渲染

点击"今天"后 showToday 变为 false,按钮从布局移除导致 Row 高度
跳变 3px(85→82),引起标题栏抖动。改为始终保留按钮在布局中,
用 graphicsLayer alpha + animateFloatAsState 做淡入淡出动画,
clickable(enabled) 控制可点击性,Row 高度不再变化。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-18 18:06:12 +08:00
parent 3a3e6014d8
commit 40c34f0606

View File

@ -1,6 +1,7 @@
package plus.rua.project.ui
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
@ -18,6 +19,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.runtime.getValue
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@ -83,14 +87,19 @@ fun MonthHeader(
)
}
Spacer(modifier = Modifier.weight(1f))
if (showToday && onToday != null) {
val todayAlpha by animateFloatAsState(
targetValue = if (showToday && onToday != null) 1f else 0f,
animationSpec = tween(200)
)
if (onToday != null) {
Text(
text = "今天",
color = MaterialTheme.colorScheme.primary,
fontSize = 14.sp,
modifier = Modifier
.graphicsLayer { alpha = todayAlpha }
.clip(RoundedCornerShape(12.dp))
.clickable(onClick = onToday)
.clickable(enabled = showToday, onClick = onToday)
.padding(horizontal = 10.dp, vertical = 4.dp)
)
}