为什么当我在 Compose 中使用 ImagePainter.State.Success 时,临时图像一直显示?
Why doest a temp image keep to display when I use ImagePainter.State.Success in Compose?
以下代码A来自官方样本project.
我认为代码A是错误的,我认为这行有两张图片,左边的图片是加载时显示的真实图片,右边的图片是加载时显示的临时图片正在加载真实图像。
所以我用代码 B 替换了代码 A。
但实际上 UI 首先显示一个名为 ic_crane_logo 的临时图像,然后显示真实图像,正如我在 运行 代码 A 时所预期的那样。 UI当我 运行 代码 B.
时一直显示温度 iamge
我的思路和代码有什么问题?
代码A
Row(
modifier = modifier
.clickable { onItemClicked(item) }
.padding(top = 12.dp, bottom = 12.dp)
) {
ExploreImageContainer {
Box {
val painter = rememberImagePainter(
data = item.imageUrl,
builder = {
crossfade(true)
}
)
Image(
painter = painter,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.fillMaxSize(),
)
if (painter.state is ImagePainter.State.Loading) {
Image(
painter = painterResource(id = R.drawable.ic_crane_logo),
contentDescription = null,
modifier = Modifier
.size(36.dp)
.align(Alignment.Center),
)
}
}
}
...
}
代码B
Row(
modifier = modifier
.clickable { onItemClicked(item) }
.padding(top = 12.dp, bottom = 12.dp)
) {
ExploreImageContainer {
Box {
val painter = rememberImagePainter(
data = item.imageUrl,
builder = {
crossfade(true)
}
)
if (painter.state is ImagePainter.State.Success){
Image(
painter = painter,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.fillMaxSize(),
)
}else{
Image(
painter = painterResource(id = R.drawable.ic_crane_logo),
contentDescription = null,
modifier = Modifier
.size(36.dp)
.align(Alignment.Center),
)
}
}
}
...
}
rememberImagePainter
没有开始加载图像。
它仅在相应的 Image
添加到视图树并具有 non-zero 维度时启动。
只要不加载,Image
就是一个透明视图,将它从视图树中移除不会带来性能提升,所以部分代码A完全正确。
以下代码A来自官方样本project.
我认为代码A是错误的,我认为这行有两张图片,左边的图片是加载时显示的真实图片,右边的图片是加载时显示的临时图片正在加载真实图像。
所以我用代码 B 替换了代码 A。
但实际上 UI 首先显示一个名为 ic_crane_logo 的临时图像,然后显示真实图像,正如我在 运行 代码 A 时所预期的那样。 UI当我 运行 代码 B.
时一直显示温度 iamge我的思路和代码有什么问题?
代码A
Row(
modifier = modifier
.clickable { onItemClicked(item) }
.padding(top = 12.dp, bottom = 12.dp)
) {
ExploreImageContainer {
Box {
val painter = rememberImagePainter(
data = item.imageUrl,
builder = {
crossfade(true)
}
)
Image(
painter = painter,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.fillMaxSize(),
)
if (painter.state is ImagePainter.State.Loading) {
Image(
painter = painterResource(id = R.drawable.ic_crane_logo),
contentDescription = null,
modifier = Modifier
.size(36.dp)
.align(Alignment.Center),
)
}
}
}
...
}
代码B
Row(
modifier = modifier
.clickable { onItemClicked(item) }
.padding(top = 12.dp, bottom = 12.dp)
) {
ExploreImageContainer {
Box {
val painter = rememberImagePainter(
data = item.imageUrl,
builder = {
crossfade(true)
}
)
if (painter.state is ImagePainter.State.Success){
Image(
painter = painter,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.fillMaxSize(),
)
}else{
Image(
painter = painterResource(id = R.drawable.ic_crane_logo),
contentDescription = null,
modifier = Modifier
.size(36.dp)
.align(Alignment.Center),
)
}
}
}
...
}
rememberImagePainter
没有开始加载图像。
它仅在相应的 Image
添加到视图树并具有 non-zero 维度时启动。
只要不加载,Image
就是一个透明视图,将它从视图树中移除不会带来性能提升,所以部分代码A完全正确。