diff --git a/app/src/main/java/com/stand/standapp/ui/chat/FloatingChatWidget.kt b/app/src/main/java/com/stand/standapp/ui/chat/FloatingChatWidget.kt index 42585f5..84dcd91 100644 --- a/app/src/main/java/com/stand/standapp/ui/chat/FloatingChatWidget.kt +++ b/app/src/main/java/com/stand/standapp/ui/chat/FloatingChatWidget.kt @@ -94,25 +94,19 @@ fun FloatingChatWidget() { visible = true } - // 👈 用 FAB 位置计算对话框位置,但强制钳制在屏幕内 - // FAB右下角为基准:对话框应该出现在 FAB 附近 - val fabRight = screenWidthPx - paddingPx * 2 + fabOffsetX // FAB右边缘 - val fabBottom = screenHeightPx - paddingPx * 2 - navBarPx + fabOffsetY // FAB下边缘 - - // 对话框优先放在 FAB 左上方,如果放不下就贴边 - val rawX = fabRight - cardWidthPx - paddingPx // FAB左边 - val rawY = fabBottom - cardHeightPx - paddingPx // FAB上边 - - // 👈 关键:钳制到屏幕内 - val clampedX = rawX.coerceIn(0f, screenWidthPx - cardWidthPx) - val clampedY = rawY.coerceIn(0f, screenHeightPx - cardHeightPx) - AnimatedVisibility( visible = visible, enter = fadeIn(animationSpec = tween(300)) + scaleIn(initialScale = 0.8f, animationSpec = tween(300)), exit = fadeOut(animationSpec = tween(200)) + scaleOut(targetScale = 0.8f, animationSpec = tween(200)), modifier = Modifier .offset { + val fabRight = screenWidthPx - paddingPx * 2 + fabOffsetX + val fabBottom = screenHeightPx - paddingPx * 2 - navBarPx + fabOffsetY + val rawX = fabRight - cardWidthPx - paddingPx + val rawY = fabBottom - cardHeightPx - paddingPx + val clampedX = rawX.coerceIn(0f, screenWidthPx - cardWidthPx) + val clampedY = rawY.coerceIn(0f, screenHeightPx - cardHeightPx) + IntOffset( (clampedX + cardDragX).roundToInt() .coerceIn(0, (screenWidthPx - cardWidthPx).toInt()),