从 localPath 加载的 Jetpack 线圈 GIF

问题描述 投票:0回答:1

我正在开始进行android开发,特别是WearOS,所以我对此不太了解。
我想显示 gif 但未从 R.drawable 加载。
根据我的理解,可绘制对象在编译过程中得到“详细说明”。由于我需要大量的 gif,在 ResourceManager 上传器上上传并设置它们的密度是不可能的。而且,等资产量多了,我就编不下去了

在网上查找,我能够创建一个名为“共享”的模块来托管我的 gif,并将我的文件上传到那里。 共享 > scr > 主 > 资产 > 文件夹 > example.gif

项目文件树

到目前为止一切顺利,我可以使用 filePath 访问我的静态图像。 现在我想显示 gif,但我无法做到。

到目前为止的代码:

@ExperimentalCoilApi  
@Composable  
fun GifImage(filePath: String, modifier: Modifier = Modifier) {  
    val inputStream: InputStream = LocalContext.current.assets.open("dex/$filePath"). 
    val bufferedSource = inputStream.source().buffer()  
    val imageLoader = ImageLoader.Builder(LocalContext.current).build(). 

    var loadingState by remember { mutableStateOf(false) }

    val painter = rememberAsyncImagePainter(
        imageLoader = imageLoader,
        model = ImageRequest.Builder(LocalContext.current)
            .data(bufferedSource)
            .decoderFactory(
                if (Build.VERSION.SDK_INT >= 28) ImageDecoderDecoder.Factory()
                else GifDecoder.Factory())
            .size(Size.ORIGINAL)
            .build(),
        onSuccess = {
            loadingState = true
        }
    )

    if (loadingState){
        Image(
            painter = painter,
            contentDescription = null
        )
    } else {
        Text("Loading")
    }

}

我也尝试过使用 AsyncImage 但没办法。
如果我将 gif 上传为可绘制并使用

.data(R.drawable.文件名)

它可以工作,但不适用于用于处理静态图像(.png)的文件路径

截图

android kotlin android-jetpack-compose coil
1个回答
0
投票

看起来您已经接近实现该功能,但使用 Coil 处理 GIF 可能需要进行一些调整。由于 Coil 需要一个可以解码 GIF 的数据源,因此直接通过 InputStream 使用资源可能需要将其转换为有效的 URI。

以下是如何修改代码以直接使用资源文件夹中的 GIF:

将资源路径转换为 file:///android_asset/ URI,Coil 应该能够直接识别。

更新 ImageRequest 以使用此 URI 格式而不是 InputStream。

以下是调整示例:

@Composable  
fun GifImage(filePath: String, modifier: Modifier = Modifier) {  
    val imageLoader = ImageLoader.Builder(LocalContext.current).build()

    var loadingState by remember { mutableStateOf(false) }

    val painter = rememberAsyncImagePainter(
        imageLoader = imageLoader,
        model = ImageRequest.Builder(LocalContext.current)
            .data("file:///android_asset/dex/$filePath") // Use URI format for assets
            .decoderFactory(
                if (Build.VERSION.SDK_INT >= 28) ImageDecoderDecoder.Factory()
                else GifDecoder.Factory()
            )
            .size(Size.ORIGINAL)
            .build(),
        onSuccess = {
            loadingState = true
        }
    )

    if (loadingState){
        Image(
            painter = painter,
            contentDescription = null,
            modifier = modifier
        )
    } else {
        Text("Loading", modifier = modifier)
    }
}```
This approach should help Coil access the GIF in your assets folder without requiring it in R.drawable. Additionally, make sure that Coil dependencies are correctly set up for handling GIFs:

gradle
```implementation("io.coil-kt:coil-compose:1.x.x")
implementation("io.coil-kt:coil-gif:1.x.x")

此方法应该允许您动态加载 GIF,而无需在 R.drawable 中手动管理它们。如果这有效或者您遇到任何问题,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.