Загрузка локальных чертежей с помощью Coil Compose
Я недавно перешел из Концерна.
ImagePainter
к Coil , ниже приведен соответствующий код после моих обновлений.
val painter = rememberImagePainter(DRAWABLE_RESOURCE_ID)
when (painter.state) {
is ImagePainter.State.Empty -> Timber.w("Empty")
is ImagePainter.State.Loading -> {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.wrapContentSize()
) {
CircularProgressIndicator()
}
}
is ImagePainter.State.Success -> {
Image(
painter = painter,
contentDescription = null,
contentScale = ContentScale.Fit,
modifier = Modifier
.padding(8.dp)
.size(84.dp)
.clip(RoundedCornerShape(corner = CornerSize(16.dp)))
)
}
is ImagePainter.State.Error -> Timber.e("Error")
}
Теперь эти изображения не отображаются и
painter.state
всегда пусто . Моя прежняя реализация «Аккомпанемент» отображала изображения к этому моменту в коде. Так же работает, если я использую сток
painterResource(resId)
из Compose.
Что мне не хватает для исполнения нового Coil
painter
через его состояния?
4 ответа
Вы можете использовать идентификатор ресурса drawable в качестве модели для компоновки AsyncImage катушки.
AsyncImage(
model = R.drawable.bg_gradient,
contentDescription = "Gradient background",
)
Существует значительная разница в производительности между составными компонентами -Image
иAsyncImage
. Так что загрузка CoilAsyncImage иногда очень удобна.
Как предложил @Philip Dukhov, вам не нужна катушка для загрузки локальных ресурсов.
Если вы хотите его использовать, вы можете просто использовать свой код, используя:
val painter = rememberImagePainter(R.drawable.xxx)
val state = painter.state
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.wrapContentSize()
) {
AnimatedVisibility(visible = (state is ImagePainter.State.Loading)) {
CircularProgressIndicator()
}
Image(
painter = painter,
contentDescription = null,
modifier = Modifier.size(128.dp)
)
}
Катушка для загрузки локальных ресурсов не нужна. Вы можете использовать систему
painterResource
:
Image(
painter = painterResource(id = R.drawable.test),
contentDescription = null,
contentScale = ContentScale.Fit,
modifier = Modifier
.padding(8.dp)
.size(84.dp)
.clip(RoundedCornerShape(corner = CornerSize(16.dp)))
)
Если вы используете его для удаления загрузки изображения: после перехода от аккомпаниатора к катушке художник не начнет загрузку, если он не находится в иерархии дерева просмотра. Так что ты можешь двигаться
Image
в
Box
с твоим
while
:
Box(contentAlignment = Alignment.Center) {
val painter = rememberImagePainter(R.drawable.test)
Image(
painter = painter,
contentDescription = null,
contentScale = ContentScale.Fit,
modifier = Modifier
.padding(8.dp)
.size(84.dp)
.clip(RoundedCornerShape(corner = CornerSize(16.dp)))
)
when (painter.state) {
is ImagePainter.State.Empty -> Timber.w("Empty")
is ImagePainter.State.Loading -> {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.wrapContentSize()
) {
CircularProgressIndicator()
}
}
is ImagePainter.State.Success -> {
}
is ImagePainter.State.Error -> Timber.e("Error")
}
}
Кроме того, он может не начать загрузку, если вы не предоставите достаточно модификаторов размера (это не ваш случай, просто чтобы вы знали). Ознакомьтесь с этим ответом для получения дополнительной информации.
val context = LocalContext.current
val imageLoader = ImageLoader(context)
val request = ImageRequest.Builder(context)
.data(thumbnailUrl)
.build()
val painter = rememberImagePainter(
request = request,
imageLoader = imageLoader
)
val state = painter.state
Image(
painter = painter,
contentDescription = "thumbnail image",
modifier = Modifier
.fillMaxSize()
.placeholder(
visible = state is ImagePainter.State.Loading,
color = PlaceholderDefaults.color(
backgroundColor = SMXTheme.colors.shimmer.copy(0.1f),
),
highlight = PlaceholderHighlight.shimmer(),
),
contentScale = ContentScale.Crop
)