Skip to content

Commit 3d9ab4e

Browse files
committed
支持动态毛玻璃效果,优化 optimizedFrostedGlass 修饰符,新增鼠标位置追踪以动态调整渐变中心,增强卡片交互视觉与动画体验。
1 parent 297e1ec commit 3d9ab4e

File tree

2 files changed

+103
-105
lines changed

2 files changed

+103
-105
lines changed

composeApp/src/wasmJsMain/kotlin/love/forte/simbot/codegen/components/GroupCard.kt

Lines changed: 26 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import androidx.compose.material3.CardDefaults
1212
import androidx.compose.material3.MaterialTheme
1313
import androidx.compose.material3.OutlinedCard
1414
import androidx.compose.material3.Text
15-
import androidx.compose.runtime.Composable
16-
import androidx.compose.runtime.getValue
17-
import androidx.compose.runtime.remember
15+
import androidx.compose.runtime.*
1816
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.geometry.Offset
18+
import androidx.compose.ui.input.pointer.*
1919
import androidx.compose.ui.text.font.FontWeight
2020
import androidx.compose.ui.unit.dp
2121

@@ -37,6 +37,9 @@ fun GroupCard(
3737
) {
3838
val interactionSource = remember { MutableInteractionSource() }
3939
val isHovered by interactionSource.collectIsHoveredAsState()
40+
41+
// 鼠标位置状态,用于动态调整毛玻璃效果的渐变中心
42+
var mousePosition by remember { mutableStateOf<Offset?>(null) }
4043

4144
val cardBorderColor by animateColorAsState(
4245
targetValue = if (isHovered) {
@@ -66,7 +69,26 @@ fun GroupCard(
6669
OutlinedCard(
6770
modifier = modifier
6871
.fillMaxWidth()
69-
.optimizedFrostedGlass(isActive = isHovered, intensity = 0.8f, shape = cardShape)
72+
.optimizedFrostedGlass(
73+
isActive = isHovered,
74+
intensity = 0.8f,
75+
shape = cardShape,
76+
mousePosition = mousePosition
77+
)
78+
.pointerInput(isHovered) {
79+
if (isHovered) {
80+
awaitPointerEventScope {
81+
while (true) {
82+
val event = awaitPointerEvent()
83+
event.changes.firstOrNull()?.let { change ->
84+
mousePosition = change.position
85+
}
86+
}
87+
}
88+
} else {
89+
mousePosition = null
90+
}
91+
}
7092
.hoverable(interactionSource),
7193
shape = cardShape,
7294
border = BorderStroke(
@@ -116,54 +138,6 @@ fun GroupCard(
116138
}
117139
}
118140

119-
/**
120-
* 轻量级的分组容器,用于不需要卡片样式的简单分组
121-
*
122-
* @param title 分组标题
123-
* @param modifier 修饰符
124-
* @param subtitle 可选的副标题
125-
* @param content 分组内容
126-
*/
127-
@Composable
128-
fun GroupContainer(
129-
title: String,
130-
modifier: Modifier = Modifier,
131-
subtitle: String? = null,
132-
content: @Composable ColumnScope.() -> Unit
133-
) {
134-
Column(
135-
modifier = modifier.fillMaxWidth(),
136-
verticalArrangement = Arrangement.spacedBy(16.dp)
137-
) {
138-
// 标题区域
139-
Column(
140-
verticalArrangement = Arrangement.spacedBy(4.dp)
141-
) {
142-
Text(
143-
text = title,
144-
style = MaterialTheme.typography.titleLarge,
145-
fontWeight = FontWeight.Bold,
146-
color = MaterialTheme.colorScheme.primary
147-
)
148-
149-
subtitle?.let {
150-
Text(
151-
text = it,
152-
style = MaterialTheme.typography.bodyMedium,
153-
color = MaterialTheme.colorScheme.onSurfaceVariant
154-
)
155-
}
156-
}
157-
158-
// 内容区域
159-
Column(
160-
modifier = Modifier.fillMaxWidth(),
161-
verticalArrangement = Arrangement.spacedBy(12.dp),
162-
content = content
163-
)
164-
}
165-
}
166-
167141
/**
168142
* 响应式的分组网格,用于在不同屏幕尺寸下展示分组
169143
*

0 commit comments

Comments
 (0)