之前做过好几次加载图片的部分,因为没去研究,每次加载图片都只是用下面方法简单处理下
简单的加载图片方法但是这样是万万不可取的,小图片还好,要是这个bitmap很大的话,很容易出现OOM,而且还有不具备缓存设计跟无法加载gif图等等缺点。于是乎,后面就接触到了Fresco,下面就看看怎么简单的上手这个框架。
Fresco是Facebook提供的用于Android应用中的开源图片加载库,它能够从网络,本地存储和本地资源中加载图片,具备缓存设计,拥有较快的加载速度,能够加载gif图,非常使用的一个框架。
1.配置网络权限
<uses-permission android:name="android.permission.INTERNET"/>
2.在build.gradle中添加依赖
implementation 'com.facebook.fresco:animated-base-support: 0.14.1' // 在 API < 14 上的机器支持 WebP 时添加
implementation 'com.facebook.fresco:fresco:0.14.1'
implementation 'com.facebook.fresco:animated-webp:0.14.1' //支持 WebP动图时添加
implementation 'com.facebook.fresco:webpsupport:0.14.1'//支持 WebP静态图时添加
implementation 'com.facebook.fresco:animated-gif:0.14.1' // 支持 GIF 动图时添加
3.初始化Fresco类
在application中调用Fresco.initialize即可完成初始化,然后再AndroidManifest.xml 中指定 Application 类
初始化Fresco类 指定 Application4.在xml布局文件中加入命名空间
加入命名空间5.加入SimpleDraweeView
加入SimpleDraweeView6.设置DraweeController跟DraweeHierarchy
Uri uri = Uri.parse(“xxx”);
PipelineDraweeControllerBuilder sdcb = Fresco.newDraweeControllerBuilder();
sdcb.setUri(uri);
//加载失败之后,点击提示重新加载的图片资源重新加载
sdcb.setTapToRetryEnabled(true);
//图片下载完之后自动播放动画
sdcb.setAutoPlayAnimations(true);
//在指定一个新的controller的时候,使用setOldController,这可节省不必要的内存分配。
sdcb.setOldController(simpleDraweeView.getController());
ControllerListener listener =new BaseControllerListener(){
@Override
public void onSubmit(String id, Object callerContext) {
//提交请求之前调用的方法
Log.d("", "onSubmit: " + id);
}
@Override
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
// 所有图片都加载成功时触发的方法
Log.d("", "onFinalImageSet: " + id);
Toast.makeText(mContext,"加载图片成功",Toast.LENGTH_SHORT).show();
}
@Override
public void onIntermediateImageSet(String id, ImageInfo imageInfo) {
//当中间图片下载成功的时候触发,用于多图请求
}
@Override
public void onIntermediateImageFailed(String id, Throwable throwable) {
//当中间图片下载失败的时候触发,用于多图请求
}
@Override
public void onFailure(String id, Throwable throwable) {
// 加载图片失败时回调的方法
Log.d("加载图片失败", "onFailure: " + id);
Toast.makeText(mContext,"加载图片失败",Toast.LENGTH_SHORT).show();
}
@Override
public void onRelease(String id) {
//释放图片资源时加载的方法
Log.d("", "onRelease: " + id);
}
};
sdcb.setControllerListener(listener);
DraweeController controller = sdcb.build();
GenericDraweeHierarchyBuilder builder =
new GenericDraweeHierarchyBuilder(getResources());
GenericDraweeHierarchy hierarchy = builder
.setFadeDuration(300)
.setProgressBarImage(new ProgressBarDrawable())//进度展示
.build();
simpleDraweeView.setHierarchy(hierarchy);
simpleDraweeView.setController(controller);
这样,我们就完成了Fresco最简单的加载图片使用,后续会讲到详细属性设置跟配置Image pipeline缓存。
网友评论