在Fresco的SimpleDraweeView中加载可绘制的图像资源

21

我使用了 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文档中提到的方式使用了它。路径或代码有问题吗?

7个回答

61

要获取在Fresco中加载的资源图像的URI,请使用"res:/",而不是ContentResolver.SCHEME_ANDROID_RESOURCE,后者通常用于普通情况下的URI

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);

你也可以使用DraweeController来处理那个URI。

这里是Fresco支持的URI列表


我正在使用Fresco 0.7.0和0.8.1,两个版本都无法加载res:/ URI。有什么建议吗? - Hieu Rocker
1
这个有点可行,但要小心,你还必须清除该Uri的缓存,以防你有不同配置(如横向和纵向)的不同图片。 - nbarraille
1
相同的代码可以使用以下方法 UriUtil.getUriForResourceId(resId) 直接调用。 - Sumit Jain

22

我正在使用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会删除它们? - Bam
那时这些代码行是必要的,以便将Fresco 0.7.0与proguard配合使用。请参见这里的错误。现在对于Fresco 0.10.0,也许已经不再需要了。请参见这里的proguard配置 - lfmn
我不这么认为,但也许开发人员很快会添加这个功能。请参见这里这里 - lfmn

9

尝试使用这个:

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

不需要使用ImageRequest或DraweeController。

4
您可以使用以下代码进行设置:draweeView.setActualImageResource(R.drawable.background);

4

可以尝试使用以下方式:

UriUtil.getUriForResourceId(resId)


1
在Fresco库中有NoActivity.java代码的实现:
ImageRequestBuilder.newBuilderWithResourceId(R.drawable.resId).build()

0
请注意,XML drawable 不能直接用作 SimpleDraweeView 中的图像。
但是,正如 文档 所述,“如果您想将 XML drawable 显示为主要图像,则将其设置为占位符并使用 null uri。”
draweeView.setImageURI(null as String?)
draweeView.hierarchy.setPlaceholderImage(drawableImage)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接