You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose中显示RawRes资源图片?

在Jetpack Compose中加载Raw资源图片的正确方式

问题原因

你之前的两种实现无法成功加载的原因:

  • 第一种直接传入openRawResource返回的InputStream,Coil默认的数据源解析逻辑不支持直接处理这种输入流,需额外自定义解码器,成本较高。
  • 第二种直接传入资源ID,Coil会默认将其当作Drawable资源去查找,而Raw资源存储在res/raw目录下,不属于Drawable资源范畴,因此无法匹配到目标文件。

正确实现方式

通过构建指向Raw资源的Uri,让Coil可以正确识别并加载资源:

@Composable
fun RawImage(
    modifier: Modifier = Modifier,
    @RawRes resourceId: Int,
    contentDescription: String? = null,
    contentScale: ContentScale = ContentScale.Fit
) {
    val context = LocalContext.current
    // 构建Raw资源对应的Uri
    val rawUri = Uri.parse("android.resource://${context.packageName}/$resourceId")
    
    AsyncImage(
        modifier = modifier,
        model = ImageRequest.Builder(context)
            .data(rawUri)
            .build(),
        contentDescription = contentDescription,
        contentScale = contentScale
    )
}

另一种可选实现(通过资源名称构建Uri)

如果你知道Raw资源的文件名,也可以直接通过文件名构建Uri:

@Composable
fun RawImageByName(
    modifier: Modifier = Modifier,
    resourceName: String,
    contentDescription: String? = null,
    contentScale: ContentScale = ContentScale.Fit
) {
    val context = LocalContext.current
    val rawUri = Uri.parse("android.resource://${context.packageName}/raw/$resourceName")
    
    AsyncImage(
        modifier = modifier,
        model = ImageRequest.Builder(context)
            .data(rawUri)
            .build(),
        contentDescription = contentDescription,
        contentScale = contentScale
    )
}

验证要点

  • 确保Raw资源文件存在于res/raw目录下,文件名仅包含小写字母、数字、下划线,无特殊字符。
  • 确认Coil依赖已正确添加到项目中(通常为io.coil-kt:coil-compose:最新版本号)。

内容的提问来源于stack exchange,提问作者JustSightseeing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:23:22