From c3c4955c6c0e287c0017e0a14c1f7982769c4987 Mon Sep 17 00:00:00 2001 From: Igor Demin Date: Thu, 2 Dec 2021 15:10:02 +0300 Subject: [PATCH] Update README.md --- .../Image_And_Icons_Manipulations/README.md | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/tutorials/Image_And_Icons_Manipulations/README.md b/tutorials/Image_And_Icons_Manipulations/README.md index b34bb292c4..46ceb49a45 100755 --- a/tutorials/Image_And_Icons_Manipulations/README.md +++ b/tutorials/Image_And_Icons_Manipulations/README.md @@ -30,9 +30,9 @@ fun main() = singleWindowApplication { Resources -## Loading images from device storage asynchronously +## Loading images from device storage or network asynchronously -To load an image stored in the device memory you can use `loadImageBitmap`, `loadSvgPainter` or `loadXmlImageVector`. The example below shows how to use them to load an image asynchronously. +To load an image stored in the device memory (or from network) you can use `loadImageBitmap`, `loadSvgPainter` or `loadXmlImageVector`. The example below shows how to use them to load an image asynchronously. ```kotlin import androidx.compose.foundation.Image @@ -61,6 +61,7 @@ import kotlinx.coroutines.withContext import org.xml.sax.InputSource import java.io.File import java.io.IOException +import java.net.URL fun main() = singleWindowApplication { val density = LocalDensity.current @@ -72,7 +73,7 @@ fun main() = singleWindowApplication { modifier = Modifier.width(200.dp) ) AsyncImage( - load = { loadSvgPainter(File("idea-logo.svg"), density) }, + load = { loadSvgPainter("https://github.com/JetBrains/compose-jb/raw/master/artwork/idea-logo.svg", density) }, painterFor = { it }, contentDescription = "Idea logo", contentScale = ContentScale.FillWidth, @@ -101,6 +102,8 @@ fun AsyncImage( try { load() } catch (e: IOException) { + // instead of printing to console, you can also write this to log, + // or show some error placeholder e.printStackTrace() null } @@ -117,6 +120,8 @@ fun AsyncImage( } } +/* Loading from file with java.io API */ + fun loadImageBitmap(file: File): ImageBitmap = file.inputStream().buffered().use(::loadImageBitmap) @@ -125,6 +130,37 @@ fun loadSvgPainter(file: File, density: Density): Painter = fun loadXmlImageVector(file: File, density: Density): ImageVector = file.inputStream().buffered().use { loadXmlImageVector(InputSource(it), density) } + +/* Loading from network with java.net API */ + +fun loadImageBitmap(url: String): ImageBitmap = + URL(url).openStream().buffered().use(::loadImageBitmap) + +fun loadSvgPainter(url: String, density: Density): Painter = + URL(url).openStream().buffered().use { loadSvgPainter(it, density) } + +fun loadXmlImageVector(url: String, density: Density): ImageVector = + URL(url).openStream().buffered().use { loadXmlImageVector(InputSource(it), density) } + +/* Loading from network with Ktor client API (https://ktor.io/docs/client.html). */ + +/* + +suspend fun loadImageBitmap(url: String): ImageBitmap = + urlStream(url).use(::loadImageBitmap) + +suspend fun loadSvgPainter(url: String, density: Density): Painter = + urlStream(url).use { loadSvgPainter(it, density) } + +suspend fun loadXmlImageVector(url: String, density: Density): ImageVector = + urlStream(url).use { loadXmlImageVector(InputSource(it), density) } + +@OptIn(KtorExperimentalAPI::class) +private suspend fun urlStream(url: String) = HttpClient(CIO).use { + ByteArrayInputStream(it.get(url)) +} + + */ ``` Storage