Landscapist
🍂 Jetpack Compose image loading library for requesting and displaying images using Glide, Coil, Fresco
And add a dependency code to your module's build.gradle
file.
dependencies {
implementation "com.github.skydoves:landscapist-glide:1.0.6"
}
Usage
We can request and load images simply using a GlideImage
composable function.
GlideImage(
imageModel = imageUrl,
// Crop, Fit, Inside, FillHeight, FillWidth, None
contentScale = ContentScale.Crop,
// shows an image with a circular revealed animation.
circularRevealedEnabled = true,
// shows a placeholder imageAsset when loading.
placeHolder = imageResource(R.drawable.placeholder),
// shows an error imageAsset when the request failed.
error = imageResource(R.drawable.error)
)
RequestOptions and TransitionOptions
We can customize our request options using RequestOptions and TransitionOptions for applying caching strategies, loading transformations.
GlideImage(
imageModel = poster.poster,
requestOptions = RequestOptions()
.override(256, 256)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop(),
transitionOptions = BitmapTransitionOptions.withCrossFade(),
contentScale = ContentScale.Crop,
modifier = modifier,
alignment = Alignment.Center,
)
RequestBuilder
Also we can request image by passing a RequestBuilder. RequestBuilder is the backbone of the request in Glide and is responsible for bringing your options together with your requested url or model to start a new load.
GlideImage(
requestBuilder =
Glide
.with(ContextAmbient.current)
.asBitmap()
.load(poster.poster)
.apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL))
.thumbnail(0.1f)
.transition(withCrossFade()),
modifier = Modifier.constrainAs(image) {
centerHorizontallyTo(parent)
top.linkTo(parent.top)
}.aspectRatio(0.8f)
)
Composable loading, success, failure
We can create our own composable functions following requesting states.
Here is an example that shows a progress indicator when loading an image,
After complete requesting, the indicator will be gone and a content image will be shown.
And if the request failed (e.g. network error, wrong destination), error text will be shown.
GlideImage(
imageModel = poster.poster,
modifier = modifier,
// shows a progress indicator when loading an image.
loading = {
ConstraintLayout(
modifier = Modifier.fillMaxSize()
) {
val indicator = createRef()
CircularProgressIndicator(
modifier = Modifier.constrainAs(indicator) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
start.linkTo(parent.start)
end.linkTo(parent.end)
}
)
}
},
// shows an error text message when request failed.
failure = {
Text(text = "image request failed.")
})
And add a dependency code to your module's build.gradle
file.
dependencies {
implementation "com.github.skydoves:landscapist-coil:<version>"
}
Usage
We can request and load images simply using a CoilImage
composable function.
CoilImage(
imageModel = imageUrl,
// Crop, Fit, Inside, FillHeight, FillWidth, None
contentScale = ContentScale.Crop,
// shows an image with a circular revealed animation.
circularRevealedEnabled = true,
// shows a placeholder imageAsset when loading.
placeHolder = imageResource(R.drawable.placeholder),
// shows an error imageAsset when the request failed.
error = imageResource(R.drawable.error)
)
ImageRequest and ImageLoader
We can customize request options using ImageRequest and ImageLoader for providing all the necessary information for loading images like caching strategies and transformations.
CoilImage(
imageRequest = ImageRequest.Builder(ContextAmbient.current)
.data(poster.poster)
.crossfade(true)
.build(),
imageLoader = ImageLoader.Builder(ContextAmbient.current)
.availableMemoryPercentage(0.25)
.crossfade(true)
.build(),
contentScale = ContentScale.Crop,
modifier = modifier,
alignment = Alignment.Center,
)
Composable loading, success, failure
We can create our own composable functions following requesting states. Here is an example that shows a progress indicator when loading an image, After complete requesting, the indicator will be gone and a content image will be shown. And if the request failed (e.g. network error, wrong destination), error text will be shown.
CoilImage(
imageModel = poster.poster,
modifier = Modifier.constrainAs(image) {
centerHorizontallyTo(parent)
top.linkTo(parent.top)
}.aspectRatio(0.8f),
// shows a progress indicator when loading an image.
loading = {
ConstraintLayout(
modifier = Modifier.fillMaxSize()
) {
val indicator = createRef()
CircularProgressIndicator(
modifier = Modifier.constrainAs(indicator) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
start.linkTo(parent.start)
end.linkTo(parent.end)
}
)
}
},
// shows an error text message when request failed.
failure = {
Text(text = "image request failed.")
})
Shimmer effect
We can give a shimmering effect when loading images using a ShimmerParams
. We can also use ShimmerParams
in GlideImage
and FrescoImage
.
CoilImage(
imageModel = poster.poster,
modifier = modifier,
// shows a shimmering effect when loading an image.
shimmerParams = ShimmerParams(
baseColor = MaterialTheme.colors.background,
highlightColor = shimmerHighLight,
durationMillis = 350,
dropOff = 0.65f,
tilt = 20f
),
// shows an error text message when request failed.
failure = {
Text(text = "image request failed.")
})
And add a dependency code to your module's build.gradle
file.
dependencies {
implementation "com.github.skydoves:landscapist-fresco:<version>"
}
Initialize
We should initialize Fresco
using ImagePipelineConfig in our Application
class.
If we need to fetch images from the network, recommend using OkHttpImagePipelineConfigFactory
.
By using an ImagePipelineConfig
, we can customize caching, networking, and thread pool strategies.
Here are more references related to the pipeline config.
class App : Application() {
override fun onCreate() {
super.onCreate()
val pipelineConfig =
OkHttpImagePipelineConfigFactory
.newBuilder(this, OkHttpClient.Builder().build())
.setDiskCacheEnabled(true)
.setDownsampleEnabled(true)
.setResizeAndRotateEnabledForNetwork(true)
.build()
Fresco.initialize(this, pipelineConfig)
}
}
Usage
We can request and load images simply using a FrescoImage
composable function.
FrescoImage(
imageUrl = stringImageUrl,
// Crop, Fit, Inside, FillHeight, FillWidth, None
contentScale = ContentScale.Crop,
// shows an image with a circular revealed animation.
circularRevealedEnabled = true,
// shows a placeholder imageAsset when loading.
placeHolder = imageResource(R.drawable.placeholder),
// shows an error imageAsset when the request failed.
error = imageResource(R.drawable.error)
)
We can customize our requests using an ImageRequest that consists only of a URI, we can use the helper method ImageRequest.fromURI.
val imageRequest = ImageRequestBuilder
.newBuilderWithSource(uri)
.setImageDecodeOptions(decodeOptions)
.setLocalThumbnailPreviewsEnabled(true)
.setLowestPermittedRequestLevel(RequestLevel.FULL_FETCH)
.setProgressiveRenderingEnabled(false)
.setResizeOptions(ResizeOptions(width, height))
.build()
FrescoImage(
imageUrl = stringImageUrl,
imageRequest = imageRequest,
contentScale = ContentScale.Crop)
Composable loading, success, failure
We can create our own composable functions following requesting states.
Here is an example that shows a progress indicator when loading an image,
After complete requesting, the indicator will be gone and a content image will be shown.
And if the request failed (e.g. network error, wrong destination), error text will be shown.
FrescoImage(
imageUrl = stringImageUrl,
modifier = modifier,
// shows a progress indicator when loading an image.
loading = {
ConstraintLayout(
modifier = Modifier.fillMaxSize()
) {
val indicator = createRef()
CircularProgressIndicator(
modifier = Modifier.constrainAs(indicator) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
start.linkTo(parent.start)
end.linkTo(parent.end)
}
)
}
},
// shows an error text message when request failed.
failure = {
Text(text = "image request failed.")
})
Also, we can customize the content image using our own composable function like below.
FrescoImage(
imageUrl = imageUrl,
// draw a resized image.
success = { frescoImageState ->
frescoImageState.imageAsset?.let {
Image(
asset = it,
modifier = Modifier
.width(128.dp)
.height(128.dp))
}
},
loading = {
// do something
})
Find this repository useful? ❤️
Support it by joining stargazers for this repository. ⭐
And follow me for my next creations! 🤩
License
Designed and developed by 2020 skydoves (Jaewoong Eum)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.