我有一個可組合的功能,它為表面分配大小。
@Composable
private fun CreateImage(modifier: Modifier = Modifier) {
Surface(
modifier = modifier
.size(150.dp)
.padding(5.dp),
shape = CircleShape,
border = BorderStroke(1.dp, Color.LightGray)
) {
Image(
painter = painterResource(id = R.drawable.profile_image),
contentDescription = "Profile Image",
contentScale = ContentScale.Crop
)
}
}
當我呼叫另一個方法并更改修改器引數中的大小時,它不應該堅持 150dp。
如果我呼叫這個方法:
@Composable
private fun ChangeSize(name: String) {
CreateImage(Modifier.size(100.dp))
}
即使在 CreateImage 中我將其設定為 150dp,它仍保持 100dp 的大小。為什么尺寸沒有變為 150dp 并保持 100dp?
我認為應該將其更改為 150dp。為什么不是這樣?
uj5u.com熱心網友回復:
Modifier 使用它獲得的第一個尺寸,當人們不為您的 Composable 提供任何尺寸時,這是一個很棒的功能。
例如
CircleDisplay(
modifier = circleModifier
.widthIn(min = 70.dp)
.heightIn(min = 70.dp),
color = color
)
如果有人不提供任何寬度或高度的修改器,而不是具有 0 高度和寬度,則您為可組合物件提供最小尺寸。您可以根據您的實施將其更改為最大或精確大小。但是當用戶修飾符有一些寬度高度而不是你的時,由于使用了第一個尺寸,所以使用他們提供的寬度高度。
像 Slider 這樣的默認 Composables 也使用此模式,因此無需設定任何尺寸,它的高度為 48.dp 并填充其父級的最大寬度。
Slider 下的 BoxWithConstraint 為
BoxWithConstraints(
modifier
.minimumTouchTargetSize()
.requiredSizeIn(minWidth = ThumbRadius * 2, minHeight = ThumbRadius * 2)
.sliderSemantics(value, tickFractions, enabled, onValueChange, valueRange, steps)
.focusable(enabled, interactionSource)
) {
// Rest of the Slider Implementation
}
uj5u.com熱心網友回復:
您的可組合檔案的大小始終為 150.dp 的原因是修飾符的應用方式。當修飾符鏈接到可組合物件時,它們會從上到下順序應用,直到應用最后一個修飾符。這可以用一個非常簡單的Box可組合來證明
@Composable
fun Screen(){
Box(
modifier = Modifier
.size(100.dp)
.background(color = Color.Yellow)
.background(color = Color.Green)
.background(color = Color.Red)
)
在這個簡單Box的組合中,渲染顏色將是Color.Red因為它將是在繪制到螢屏上之前應用的最后一種顏色。
上面的示例中也發生了類似的事情。即使您使用 100.dp 的修飾符呼叫您的可組合,應用的最終大小是 150.dp,因為您的 100.dp 修飾符在修飾符鏈中應用得太早了。
用這個替換你的可組合,它應該可以按預期作業
@Composable
private fun CreateImage(modifier: Modifier = Modifier) {
Surface(
modifier = Modifier
.size(150.dp)
.padding(5.dp)
.then(modifier), //this last modifier will override everything above
shape = CircleShape,
border = BorderStroke(1.dp, Color.LightGray)
) {
Image(
painter = painterResource(id = R.drawable.profile_image),
contentDescription = "Profile Image",
contentScale = ContentScale.Crop
)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/453044.html
