@@ -12,10 +12,10 @@ import androidx.compose.material3.CardDefaults
1212import androidx.compose.material3.MaterialTheme
1313import androidx.compose.material3.OutlinedCard
1414import 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.*
1816import androidx.compose.ui.Modifier
17+ import androidx.compose.ui.geometry.Offset
18+ import androidx.compose.ui.input.pointer.*
1919import androidx.compose.ui.text.font.FontWeight
2020import 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