在 Compose 中,一旦 Coil 从 URL 加载图像,如何访问 drawable

Md *_*din 6 android android-jetpack-compose

我正在使用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
    )
Run Code Online (Sandbox Code Playgroud)

然后通过画家Image这样:

Image(
   painter = painter,
   contentDescription = "Some Image",
)
Run Code Online (Sandbox Code Playgroud)

图像加载没有任何问题,但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
                    }
                }
            )
        }
    )
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*tti 5

您可以使用onSuccess回调来获取可绘制对象:

AsyncImage(
    model = url,
    contentDescription = null,
    onSuccess = { success ->
        val drawable = success.result.drawable
    }
)
Run Code Online (Sandbox Code Playgroud)

您也可以对rememberAsyncImagePainter.


jac*_*ood 4

LaunchedEffect我认为您想与 an 一起使用来ImageLoader从加载器结果访问位图。

    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
        }
    }
Run Code Online (Sandbox Code Playgroud)