Jetpack Compose:如果文本不适合使用不同的布局?
Jetpack Compose: Use different layout if text does not fit?
假设我有一个固定大小的矩形,里面有一些文本。由于用户可以从系统 - 设备上的辅助功能设置更改字体大小,因此字体可能不适合固定大小的矩形。如果发生这种情况,我们希望将文本呈现在矩形之外。
据我所知,我应该以某种方式测量文本的宽度(例如),看看它是否适合矩形,如果不适合,以不同的方式布置组件。
我如何在 Jetpack Compose 中执行此操作?
所以对于这个伪代码,如果 text
不适合 Box
我想在它下面布置文本,从而引入 Column
等。
@Composable
fun myView() {
val text = Text("Some text")
Box(modifier = Modifier.size(40.dp)) {
text
}
}
使用onTextLayout
您可以获得绘制文本的大小。
为了防止在计算尺寸时实际绘制它,您可以使用 drawWithContent
修饰符。
var textSize by remember { mutableStateOf<IntSize?>(null) }
val density = LocalDensity.current
val maxDimensionDp = remember(textSize) {
textSize?.let { textSize ->
with(density) {
maxOf(textSize.width, textSize.height).toDp()
}
}
}
val textComposable = @Composable {
Text(
"Some text",
onTextLayout = {
textSize = it.size
},
modifier = Modifier.drawWithContent {
if (textSize != null) {
drawContent()
}
}
)
}
when {
maxDimensionDp == null -> {
// calculating size.
// because of drawWithContent it's not gonna be drawn
textComposable()
}
maxDimensionDp < 40.dp -> {
Box(modifier = Modifier.size(40.dp).background(Color.Red)) {
textComposable()
}
}
else -> {
Column(modifier = Modifier.background(Color.Green)) {
textComposable()
}
}
}
假设我有一个固定大小的矩形,里面有一些文本。由于用户可以从系统 - 设备上的辅助功能设置更改字体大小,因此字体可能不适合固定大小的矩形。如果发生这种情况,我们希望将文本呈现在矩形之外。
据我所知,我应该以某种方式测量文本的宽度(例如),看看它是否适合矩形,如果不适合,以不同的方式布置组件。
我如何在 Jetpack Compose 中执行此操作?
所以对于这个伪代码,如果 text
不适合 Box
我想在它下面布置文本,从而引入 Column
等。
@Composable
fun myView() {
val text = Text("Some text")
Box(modifier = Modifier.size(40.dp)) {
text
}
}
使用onTextLayout
您可以获得绘制文本的大小。
为了防止在计算尺寸时实际绘制它,您可以使用 drawWithContent
修饰符。
var textSize by remember { mutableStateOf<IntSize?>(null) }
val density = LocalDensity.current
val maxDimensionDp = remember(textSize) {
textSize?.let { textSize ->
with(density) {
maxOf(textSize.width, textSize.height).toDp()
}
}
}
val textComposable = @Composable {
Text(
"Some text",
onTextLayout = {
textSize = it.size
},
modifier = Modifier.drawWithContent {
if (textSize != null) {
drawContent()
}
}
)
}
when {
maxDimensionDp == null -> {
// calculating size.
// because of drawWithContent it's not gonna be drawn
textComposable()
}
maxDimensionDp < 40.dp -> {
Box(modifier = Modifier.size(40.dp).background(Color.Red)) {
textComposable()
}
}
else -> {
Column(modifier = Modifier.background(Color.Green)) {
textComposable()
}
}
}