From d974ad35af0aa4585091303256dbe221fe04a1fb Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Sat, 30 Aug 2025 17:43:48 +0000 Subject: [PATCH] 超出父容器 --- libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt | 68 +++++++++++++++++++++++++++++----- 1 files changed, 58 insertions(+), 10 deletions(-) diff --git a/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt b/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt index 6721df2..0208e22 100644 --- a/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt +++ b/libmvi/src/main/java/com/runt/open/mvi/views/PublicViews.kt @@ -1,5 +1,6 @@ package com.runt.open.mvi.views +import android.util.Log import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -14,8 +15,9 @@ import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon @@ -27,7 +29,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.Layout import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog @@ -41,6 +46,32 @@ * @purpose * @date 5/18/25 */ + +/** + * 超出父容器 + */ +@Composable +fun UnboundedBox( + modifier: Modifier = Modifier, + content: @Composable () -> Unit +) { + Layout(content, modifier) { measurables, parent -> + // 给子树宽高用"无限"上限测量 + val loose = Constraints( + minWidth = 0, minHeight = 0, + maxWidth = Int.MAX_VALUE, maxHeight = Int.MAX_VALUE + ) + val placeables = measurables.map { it.measure(loose) } + + // 自己仍按父约束的大小布局(不撑爆父) + val w = parent.maxWidth + val h = parent.maxHeight + layout(w, h) { + // 放在(0,0)。如需往外探出,可用负偏移:placeRelative(-50, 0) + placeables.forEach { it.placeRelative(0, 0) } + } + } +} @Composable fun LoadingDialog( loadingState : LoadingState) { @@ -70,10 +101,12 @@ fun MessageDialog(message : MessageState){ if(message.isVisible){ Dialog(onDismissRequest = { - if(message.cancelDissmiss){ + //系统响应 + Log.i("PublicViews" , "MessageDialog: onDismiss") + if(message.touchOutside){ message.setDismiss.invoke() + message.onDismissRequest.invoke() } - message.onDismissRequest.invoke() }) { Card( modifier = Modifier @@ -84,7 +117,8 @@ ) { Column(modifier = Modifier.wrapContentHeight()){ Text(text = message.title, fontSize = 16.sp, - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() .padding(top = 20.dp , start = 20.dp) .wrapContentSize(Alignment.Center), textAlign = TextAlign.Center) @@ -93,7 +127,7 @@ modifier = Modifier .fillMaxWidth() .wrapContentSize() - .padding(top = 30.dp , bottom = 20.dp, start = 14.dp, end = 15.dp) + .padding(top = 30.dp , bottom = 20.dp , start = 14.dp , end = 15.dp) .wrapContentSize(Alignment.Center), textAlign = TextAlign.Center, ) @@ -103,9 +137,15 @@ Button(onClick = { if(message.cancelDissmiss){ message.setDismiss.invoke() + message.onDismissRequest.invoke() } - message.onDismissRequest.invoke() - }) { + message.onCancelRequest.invoke() + }, + colors = ButtonDefaults.buttonColors( + containerColor = Color.Gray, // 背景色 + contentColor = Color.White, // 文字/图标颜色 + disabledContainerColor = Color.Gray // 禁用时背景色 + ),) { Text(text = message.cancelText) } } @@ -113,6 +153,7 @@ Button(onClick = { if(message.confirmDissmiss){ message.setDismiss.invoke() + message.onDismissRequest.invoke() } message.onConfirmRequest.invoke() }) { @@ -132,8 +173,10 @@ alignment = Alignment.TopCenter, ) { Surface( - modifier = Modifier.fillMaxWidth() - .wrapContentHeight().padding(10.dp), + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight() + .padding(10.dp), shadowElevation = 2.dp, border = BorderStroke(1.dp, Color.Gray) , shape = RoundedCornerShape(8.dp) @@ -159,7 +202,7 @@ .height(50.dp), verticalAlignment = Alignment.CenterVertically) { Spacer(modifier = Modifier.size(15.dp)) IconButton(onClick = onBackClick, modifier = Modifier.size(30.dp,30.dp)) { - Icon(Icons.Default.Close, contentDescription = null, tint = Color.Black) + Icon(Icons.Default.ArrowBack, contentDescription = null, tint = Color.Black) } Text(text = "${title}", modifier = Modifier @@ -169,4 +212,9 @@ Spacer(modifier = Modifier.size(30.dp)) Spacer(modifier = Modifier.size(15.dp)) } +} +@Preview +@Composable +fun previewLayout(){ + MessageDialog(message = MessageState(cancelText = "lll")) } \ No newline at end of file -- Gitblit v1.9.1