【问题标题】:Loading Drawable Image Resource in Fresco's SimpleDraweeView在 Fresco 的 SimpleDraweeView 中加载可绘制图像资源
【发布时间】:2015-09-02 10:54:04
【问题描述】:

我使用 Fresco 0.5.2

dependencies {
   compile 'com.facebook.fresco:fresco:0.5.2'
}

我想使用SimpleDraweeViewdrawable 加载一个gif 图像。 这是我的代码:

String path = ContentResolver.SCHEME_ANDROID_RESOURCE + "://"+ getResources().getResourcePackageName(R.drawable.default_app) + "/"
+ getResources().getResourceTypeName(R.drawable.default_app) + "/"
+ getResources().getResourceEntryName(R.drawable.default_app);
Uri uri =  Uri.parse(path);
simpleDraweeView =(SimpleDraweeView)
this.findViewById(R.id.simple_drawee_view);
        ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(uri).build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(imageRequest)
                .setAutoPlayAnimations(true)
                .build();
        simpleDraweeView.setController(controller);

default_app 只是一个 jpeg 图像,它不起作用。

我用它作为Fresco's documentation mentioned。 路径或代码有问题吗?

【问题讨论】:

    标签: android fresco


    【解决方案1】:

    你可以使用

    draweeView.setActualImageResource(R.drawable.background);

    【讨论】:

      【解决方案2】:

      试试这个:

      UriUtil.getUriForResourceId(resId)

      【讨论】:

        【解决方案3】:

        我正在使用 Fresco 0.7.0

        ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithResourceId(R.drawable.image).build();
        SimpleDraweeView draweeView = (SimpleDraweeView) v.findViewById(R.id.picture);
        draweeView.setImageURI(imageRequest.getSourceUri());
        

        如果你使用 proguard,你需要在你的 proguard 文件中添加这些行:

        -keep class com.facebook.imagepipeline.gif.** { *; }
        -keep class com.facebook.imagepipeline.webp.** { *; }
        

        【讨论】:

        • 为什么需要 ProGuard 线路?为什么 ProGuard 会删除它们?
        • 当时这些行对于让 Fresco 0.7.0 与 proguard 一起工作是必要的。见error here。现在对于 Fresco 0.10.0 可能不再需要了。见proguard config here
        • 我不这么认为,但也许开发人员会很快添加这个。见herehere
        【解决方案4】:

        Fresco 库中有 NoActivity.java 代码的实现:

        ImageRequestBuilder.newBuilderWithResourceId(R.drawable.resId).build()
        

        【讨论】:

          【解决方案5】:

          试试这个:

          String path = "res:/" + R.drawable.default_app; // Only one slash after res:
          simpleDraweeView.setImageURI(Uri.parse(path));
          

          无需使用 ImageRequest 或 DraweeController。

          【讨论】:

            【解决方案6】:

            要在 Fresco 中获取要加载的资源图像的 URI,请使用“res:/”而不是 ContentResolver.SCHEME_ANDROID_RESOURCE,后者用于 URIs in a normal case

            import com.facebook.common.util.UriUtil;
            
            Uri uri = new Uri.Builder()
                .scheme(UriUtil.LOCAL_RESOURCE_SCHEME) // "res"
                .path(String.valueOf(resId))
                .build();
            // uri looks like res:/123456789
            simpleDraweeView.setImageURI(uri);
            

            您应该也可以将该 URI 与 DraweeController 一起使用。

            这是 Fresco 的 supported URIs

            【讨论】:

            • 我正在使用 Fresco 0.7.0 和 0.8.1,两者都无法加载 res:/ URI。有什么想法吗?
            • 这有点用,但请注意,您还必须清除该 Uri 的缓存,以防您有不同配置的不同图像(如横向与纵向)
            • 同样的代码写在下面的方法UriUtil.getUriForResourceId(resId)所以可以直接使用
            猜你喜欢
            • 2019-05-02
            • 1970-01-01
            • 1970-01-01
            • 2013-06-09
            • 2014-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            相关资源
            最近更新 更多