如何在 Jetpack Compose 中使用 Coil 显示自定义可组合占位符?
How to show a custom composable placeholder using Coil in Jetpack Compose?
我需要使用 Coil 在 Jetpack Compose 中显示自定义占位符,但该占位符不是可绘制对象,它是我自定义的可组合函数。是否可以用线圈来做到这一点?
这是我使用线圈的代码片段:
Image(
modifier = Modifier
.size(120.dp)
.align(Alignment.CenterHorizontally),
painter = rememberImagePainter(
data = entry.imageUrl,
builder = {
crossfade(true)
MyPlaceholder(resourceId = R.drawable.ic_video)
},
),
contentDescription = entry.pokemonName
)
这是我的自定义占位符撰写函数:
@Composable
fun MyPlaceholder(@DrawableRes resourceId: Int) {
Surface(
modifier = Modifier.fillMaxSize(),
color = Color(0xFFE0E0E0)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
Surface(
modifier = Modifier.size(30.dp),
shape = CircleShape,
color = Color.White
) {
Image(
modifier = Modifier
.padding(
PaddingValues(
start = 11.25.dp,
top = 9.25.dp,
end = 9.25.dp,
bottom = 9.25.dp
)
)
.fillMaxSize(),
painter = painterResource(id = resourceId),
contentDescription = null
)
}
}
}
}
我的gradle(线圈):
// Coil
implementation 'io.coil-kt:coil-compose:1.4.0'
Coil 没有对可组合占位符的内置支持。
您可以将可组合项放在 Box
内,并根据状态在 Image
上显示占位符。
在我的示例中,如果状态为 Loading
或 Error
,我将显示它。您可以为 Error
案例添加另一个视图参数并使用 Crossfade
而不是 AnimatedVisibility
.
我还将 Modifier.matchParentSize()
添加到 Image
以遵循根据修饰符参数计算的父级大小。您不能将修饰符参数直接传递给 Image
,因为像 align
这样的修饰符只对直接子项有效,这就是为什么您总是必须将它传递给容器视图。
@Composable
fun Image(
painter: ImagePainter,
placeholder: @Composable () -> Unit,
contentDescription: String?,
modifier: Modifier = Modifier,
alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null,
) {
Box(modifier) {
Image(
painter = painter,
contentDescription = contentDescription,
alignment = alignment,
contentScale = contentScale,
alpha = alpha,
colorFilter = colorFilter,
modifier = Modifier.matchParentSize()
)
AnimatedVisibility(
visible = when (painter.state) {
is ImagePainter.State.Empty,
is ImagePainter.State.Success,
-> false
is ImagePainter.State.Loading,
is ImagePainter.State.Error,
-> true
}
) {
placeholder()
}
}
}
用法:
Image(
painter = rememberImagePainter(imageUrl),
placeholder = {
CustomComposableView(...)
},
contentDescription = "...",
modifier = Modifier
...
)
我需要使用 Coil 在 Jetpack Compose 中显示自定义占位符,但该占位符不是可绘制对象,它是我自定义的可组合函数。是否可以用线圈来做到这一点? 这是我使用线圈的代码片段:
Image(
modifier = Modifier
.size(120.dp)
.align(Alignment.CenterHorizontally),
painter = rememberImagePainter(
data = entry.imageUrl,
builder = {
crossfade(true)
MyPlaceholder(resourceId = R.drawable.ic_video)
},
),
contentDescription = entry.pokemonName
)
这是我的自定义占位符撰写函数:
@Composable
fun MyPlaceholder(@DrawableRes resourceId: Int) {
Surface(
modifier = Modifier.fillMaxSize(),
color = Color(0xFFE0E0E0)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
Surface(
modifier = Modifier.size(30.dp),
shape = CircleShape,
color = Color.White
) {
Image(
modifier = Modifier
.padding(
PaddingValues(
start = 11.25.dp,
top = 9.25.dp,
end = 9.25.dp,
bottom = 9.25.dp
)
)
.fillMaxSize(),
painter = painterResource(id = resourceId),
contentDescription = null
)
}
}
}
}
我的gradle(线圈):
// Coil
implementation 'io.coil-kt:coil-compose:1.4.0'
Coil 没有对可组合占位符的内置支持。
您可以将可组合项放在 Box
内,并根据状态在 Image
上显示占位符。
在我的示例中,如果状态为 Loading
或 Error
,我将显示它。您可以为 Error
案例添加另一个视图参数并使用 Crossfade
而不是 AnimatedVisibility
.
我还将 Modifier.matchParentSize()
添加到 Image
以遵循根据修饰符参数计算的父级大小。您不能将修饰符参数直接传递给 Image
,因为像 align
这样的修饰符只对直接子项有效,这就是为什么您总是必须将它传递给容器视图。
@Composable
fun Image(
painter: ImagePainter,
placeholder: @Composable () -> Unit,
contentDescription: String?,
modifier: Modifier = Modifier,
alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null,
) {
Box(modifier) {
Image(
painter = painter,
contentDescription = contentDescription,
alignment = alignment,
contentScale = contentScale,
alpha = alpha,
colorFilter = colorFilter,
modifier = Modifier.matchParentSize()
)
AnimatedVisibility(
visible = when (painter.state) {
is ImagePainter.State.Empty,
is ImagePainter.State.Success,
-> false
is ImagePainter.State.Loading,
is ImagePainter.State.Error,
-> true
}
) {
placeholder()
}
}
}
用法:
Image(
painter = rememberImagePainter(imageUrl),
placeholder = {
CustomComposableView(...)
},
contentDescription = "...",
modifier = Modifier
...
)