我将Coil
与Compose
沿着使用。
我试着在加载图像时制作一个 Flink 的动画。
所有示例都将ImagePainter
与ImagePainter.State
一起使用,它工作正常,但现在标记为“deprecated”。
这就是我选择AsyncImagePainter
的原因。如果没有状态检查,它工作得很完美,但是有了检查,我得到了一个无限 Flink 的动画。
我还尝试在AsyncImagePainter
的onSuccess方法中使用mutableState更改加载状态var,但动画仍然无限
@Composable
fun FoodItem(food: Fun) {
Column (
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.Top
) {
val painter = rememberAsyncImagePainter(food.image.sm)
if (painter.state is AsyncImagePainter.State.Loading) {
AnimatedShimmer { ShimmerFoodItem(brush = it) }
} else {
Image(
modifier = Modifier
.fillMaxWidth()
.height(104.dp)
.clip(RoundedCornerShape(size = 8.dp)),
painter = painter,
contentScale = ContentScale.Crop,
contentDescription = "Food photo"
)
Text(
modifier = Modifier.padding(top = 4.dp),
text = food.title,
fontSize = MaterialTheme.typography.body1.fontSize,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
fontWeight = FontWeight.Bold
)
Text(
text = food.subtitle,
fontSize = MaterialTheme.typography.subtitle2.fontSize,
overflow = TextOverflow.Ellipsis,
maxLines = 2,
fontWeight = FontWeight.Normal
)
}
}
}
3条答案
按热度按时间vuv7lop31#
看起来
painter
需要立即提供给Image
可组合对象,以便其状态可以更改,我尝试实现您的用例,并记录了painter.state
,它不会得到更新,除非它立即提供给Image
,所以我最终得到了以下结果基于Coil样本
请不要介意
runbBlocking
和红色的Box
,我只是把它们放在那里模仿Image
上面的东西( Flink ),并延迟显示实际的Image
(获取)。希望这能有所帮助。yzxexxkh2#
我是这样做的,当状态出错时,比如说,如果图像URL无效,就会显示一个保持器图标。但我添加了另一个状态showImage,它最初为true,并且可以在ImageLoadingState更改时更改。您可以将整个代码 Package 在一个函数中,该函数接受URL参数,并且根据ShowImage/Loading/Error的状态只显示一个Composable:
wpx232ag3#
您需要使用
如果您注解行大小为,您将看到它在加载状态时卡住。您还可以提供任何您希望加载图像的尺寸,例如1280x720和
.size(coil.size.Size(1280, 720))
如果您需要从Coil的Painter获得
Bitmap
或ImageBitmap
,也可以查看此答案在可组合文件中使用之前获取位图