【问题标题】:In Compose how to access drawable once Coil loads image from URL在 Compose 中,一旦 Coil 从 URL 加载图像,如何访问 drawable
【发布时间】:2021-06-23 06:32:15
【问题描述】:

我正在使用accompanist-coil:0.12.0。我想从一个 url 加载图像,然后将 drawable 传递给一个方法。我正在使用这个:

val painter = rememberCoilPainter(
        request = ImageRequest.Builder(LocalContext.current)
            .data(imageUrl)
            .target {
                viewModel.calcDominantColor(it) { color ->
                    dominantColor = color
                }
            }
            .build(),
        fadeIn = true
    )

然后像这样将画家传递给Image

Image(
   painter = painter,
   contentDescription = "Some Image",
)

图像加载没有任何问题,但从未调用方法 calcDominantColor
我做错了吗?

更新:
我能够在 requestBuilder 中使用 Transformation 调用该方法,但我不确定是否应该这样做,因为我实际上并没有转换 Bitmap 本身:

val painter = rememberCoilPainter(
        request = entry.imageUrl,
        requestBuilder = {
            transformations(
                object: Transformation{
                    override fun key(): String {
                        return entry.imageUrl
                    }
                    override suspend fun transform(
                        pool: BitmapPool,
                        input: Bitmap,
                        size: Size
                    ): Bitmap {
                        viewModel.calcDominantColor(input) { color ->
                            dominantColor = color
                        }
                        return input
                    }
                }
            )
        }
    )

这第一次可以正常工作,但是当可组合重组时,转换从缓存返回并且我的方法没有运行。

【问题讨论】:

  • 您要应用转换吗?
  • 我想使用调色板库提取图像的主色并使用它
  • 如果需要位图可以直接使用Coil。
  • 任何链接或示例,请提供帮助
  • 你能检查更新的问题吗?这是你的意思吗?

标签: android android-jetpack-compose


【解决方案1】:

我认为您想使用 LaunchedEffectImageLoader 从加载器结果中访问位图。

    val context = LocalContext.current

    val imageLoader = ImageLoader(context)

    val request = ImageRequest.Builder(context)
        .transformations(RoundedCornersTransformation(12.dp.value))
        .data(imageUrl)
        .build()

    val imagePainter = rememberCoilPainter(
        request = request,
        imageLoader = imageLoader
    )

    LaunchedEffect(key1 = imagePainter) {
        launch {
            val result = (imageLoader.execute(request) as SuccessResult).drawable
            val bitmap = (result as BitmapDrawable).bitmap
            val vibrant = Palette.from(bitmap)
                .generate()
                .getVibrantColor(defaultColor)
            // do something with vibrant color
        }
    }

【讨论】:

  • 我得到了这个:IllegalStateException: unable to getPixels(), pixel access is not supported on Config#HARDWARE bitmaps .generate()
  • @Dr.jacky 你需要在 ImageBuilder 上禁用硬件加速 .allowHardware(false)
【解决方案2】:

我建议使用新的线圈组合库。只需复制以下内容并将其添加到应用程序 build.gradle 文件中:

implementation "io.coil-kt:coil-compose:1.4.0"

我也在按照教程进行操作,但此时卡住了。我建议复制并粘贴以下代码:

Column {
            val painter = rememberImagePainter(
                data = entry.imageUrl
            )
            val painterState = painter.state
            Image(
                painter = painter,
                contentDescription = entry.pokemonName,
                modifier = Modifier
                    .size(120.dp)
                    .align(CenterHorizontally),
            )
            if (painterState is ImagePainter.State.Loading) {
                CircularProgressIndicator(
                    color = MaterialTheme.colors.primary,
                    modifier = Modifier
                        .scale(0.5f)
                        .align(CenterHorizontally)
                )
            }
            else if (painterState is ImagePainter.State.Success) {
                LaunchedEffect(key1 = painter) {
                    launch {
                        val image = painter.imageLoader.execute(painter.request).drawable
                        viewModel.calcDominantColor(image!!) {
                            dominantColor = it
                        }
                    }
                }
            }
            Text(
                text = entry.pokemonName,
                fontFamily = RobotoCondensed,
                textAlign = TextAlign.Center,
                modifier = Modifier.fillMaxWidth()
            )
        }

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 2023-04-02
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2022-08-06
    • 2022-10-06
    • 2021-07-01
    • 2021-05-06
    相关资源
    最近更新 更多