引入Fresco:
编辑 build.gradle
文件:
dependencies {
//Fresco,无论使用哪个模块的功能,都必须要添加的基础依赖
compile 'com.facebook.fresco:fresco:0.14.1'
//下面的依赖根据需求,用到哪个模块,就导入对应的依赖即可.
// 仅支持 WebP 静态图,需要添加
compile 'com.facebook.fresco:webpsupport:0.14.1'
// 支持 GIF 动图,需要添加
compile 'com.facebook.fresco:animated-gif:0.14.1'
// 支持 WebP静态图及 WebP 动图,需要添加
compile 'com.facebook.fresco:animated-webp:0.14.1'
compile 'com.facebook.fresco:webpsupport:0.14.1'
// 在 API < 14 上的机器支持 WebP 时,需要添加
compile 'com.facebook.fresco:animated-base-support:0.14.1'
}
想要使用Fresco还需要做一下事情:
在加载图片之前,你必须初始化Fresco
类。你只需要调用Fresco.initialize
一次即可完成初始化,在 Application
里面做这件事再适合不过了(如下面的代码),注意多次的调用初始化是无意义的。
[MyApp.java]
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
做完上面的工作后,你需要在 AndroidManifest.xml
中指定你的 Application 类。为了下载网络图片,请确认你声明了网络请求的权限。
...
>
android:name="android.permission.INTERNET" />
...
android:label="@string/app_name"
android:name=".MyApp"
>
...
...
在xml布局文件中, 加入命名空间:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent"
android:layout_width="match_parent">
加入
SimpleDraweeView
:
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/my_drawable" />
注意:这里必须要设置layout_width和layout_height属性,否则不展示图 片,而且不是将属性值设置为wrap_content(因为我们使用Fresco加载图片是可以添加多个图层的,如果设置为wrap_content,但是不同图层的图片像素大小不同的话就会造成重绘的问题,用户体验特别差)
开始加载图片:
Uri uri = Uri.parse("图片地址"); SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); draweeView.setImageURI(uri);
剩下的,Fresco会替你完成:
等等等等。
Image Pipeline模块:负责从网络,从本地系统文件,本地资源加载图片,为了最大限度节省空间和CPU时间,它含有三级缓存(2ji级内存,1级磁盘)。
Fresco中设计有一个叫做Drawees模块,它会再图片加载完成之前显示占位图,加载完成后,自动释放未目标图片, 并且会及时的释放内存和空间占用,我们实现基本功能一般使用Drawees就可以了,Drawees主要包括下面几个部分:
a. DraweeView:继承于View,我们一般展示图片使用的是DraweeView的子类SimpleDraweeView,我们可以在XML和Java代码中使用,具体使用方式如模块三中介绍所示:
b. DraweeController:负责和Fresco中的 image pipeline交互,我们可以创建一个这个类的实例,来对加载的图片进行更多的控制。
c. DraweeHierarchy:可以通过它来在Java代码中自定义图片的展示,当然也可以在XML布局中定义,我们在模块三中会介绍XML中的属性设置。
d. Listeners:监听图片下载,如果你想在图片下载成功或者失败之后做操作的话,可以监听这个Listeners。
fresco:fadeDuration="300" // 淡入淡出的持续时间
fresco:actualImageScaleType="focusCrop" // 实际图像的缩放类型,类型属性值我们在下面介绍
fresco:placeholderImage="@color/wait_color" //占位图
fresco:placeholderImageScaleType="fitCenter" //占位图的缩放类型
fresco:failureImage="@drawable/error" //下载失败显示的图片
fresco:failureImageScaleType="centerInside" //失败图的缩放类型
fresco:retryImage="@drawable/retrying"//图片加载失败时显示,提示用户点击重新加载,重复加载4次还是没有加载出来的时候才会显示failureImage的图片,要显示retryImage还必须在代码中设置.setTapToRetryEnabled(true)
fresco:retryImageScaleType="centerCrop" //重新加载的图片缩放类型
fresco:progressBarImage="@drawable/progress_bar" //进度条图片
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"//进度图自动旋转间隔时间(单位:毫秒ms)
fresco:backgroundImage="@color/blue"//背景图片,这里的背景图片首先被绘制
fresco:overlayImage="@drawable/watermark"// 设置叠加图,在xml中只能设置一张叠加图片,如果需要多张图片的话,需要在java代码中设置
fresco:pressedStateOverlayImage="@color/red"// 设置点击状态下的叠加图
fresco:roundAsCircle="false" //设置为圆形图
fresco:roundedCornerRadius="1dp" // 圆角半径
fresco:roundTopLeft="true" // 左上角是否为圆角
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:roundWithOverlayColor="@color/corner_color"
fresco:roundingBorderWidth="2dp" //边框的宽度
fresco:roundingBorderColor="@color/border_color" //边框颜色
上面的ImageScaleType有下面一些缩放类型:
类型 描述
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());
GenericDraweeHierarchy hierarchy = builder
.setProgressBarImage(new ProgressBarDrawable())
.build();
draweeView.setHierarchy(hierarchy);
当然,相应的set方法也会对应相应的get方法,我们这里就只贴出了常用的方法,由于篇幅原因,其他方法我们就不贴出了,大家可以自己查看API。
我们这里只针对几个比较常用的方法进行介绍:
RoundingParams params = new RoundingParams();
params.setCornersRadius((float) 50.0);
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());
GenericDraweeHierarchy hierarchy = builder
.setProgressBarImage(new ProgressBarDrawable())// 设置进度条
.setProgressBarImageScaleType(ScalingUtils.ScaleType.CENTER)// 设置进度条缩放类型
.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP)// 设置实际图像的缩放类型
.setActualImageFocusPoint(new PointF(0,0))// 设置缩放类型为focusCrop时,需要设置一个FocusPoint坐标
.setBackground(getResources().getDrawable(R.mipmap.ic_launcher))// 设置背景
.setFadeDuration(5000)// 设置图片从渐变色的持续时间
.setFailureImage(getResources().getDrawable(R.drawable.fail))// 失败时显示的图片
.setOverlay(getResources().getDrawable(R.color.overlay))// 覆盖层
.setPlaceholderImage(getResources().getDrawable(R.drawable.place))// 设置占位图
.setPlaceholderImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE)// 设置占位图的缩放类型
.setPressedStateOverlay(getResources().getDrawable(R.drawable.overlay))// 点击时候的覆盖层
.setRetryImage(getResources().getDrawable(R.drawable.retry))//图片加载失败时显示,提示用户点击重新加载,重复加载4次还是没有加载出来的时候才会显示failureImage的图片
.setRetryImageScaleType(ScalingUtils.ScaleType.FIT_END)// 设置圆角参数
.setRoundingParams(params)
.build();
simpleDraweeView.setHierarchy(hierarchy);
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setControllerListener(controllerListener)
.setOldController(simpleDraweeView.getController())
.build()
;
simpleDraweeView.setController(draweeController);
setOldController(simpleDraweeView.getController()),在创建新的controller的时候,指定此属性,可以节省不必要的内存分配。
setControllerListener(),设置此属性,可以添加对图片下载情况的监听。
setImageRequest(),定制ImageRequest,可以对图片添加更多的处理
ImageRequest的创建和使用,这里先不进行详细的讲解,大家可以查看一下官方的API。
ControllerListener controllerListener = new BaseControllerListener(){
@Override
public void onFailure(String id, Throwable throwable) {
super.onFailure(id, throwable);
// fail
}
@Override
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
super.onFinalImageSet(id, imageInfo, animatable);
// success
}
@Override
public void onIntermediateImageSet(String id, ImageInfo imageInfo) {
super.onIntermediateImageSet(id, imageInfo);
}
@Override
public void onIntermediateImageFailed(String id, Throwable throwable) {
super.onIntermediateImageFailed(id, throwable);
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setControllerListener(controllerListener)
.build();
simpleDraweeView.setController(controller);
onFailure会在图片加载失败时候被调用。
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
.setBitmapMemoryCacheParamsSupplier(bitmapCacheParamsSupplier)
.setCacheKeyFactory(cacheKeyFactory)
.setDownsampleEnabled(true)
.setWebpSupportEnabled(true)
.setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)
.setExecutorSupplier(executorSupplier)
.setImageCacheStatsTracker(imageCacheStatsTracker)
.setMainDiskCacheConfig(mainDiskCacheConfig)
.setMemoryTrimmableRegistry(memoryTrimmableRegistry)
.setNetworkFetchProducer(networkFetchProducer)
.setPoolFactory(poolFactory)
.setProgressiveJpegConfig(progressiveJpegConfig)
.setRequestListeners(requestListeners)
.setSmallImageDiskCacheConfig(smallImageDiskCacheConfig)
.build();
Fresco.initialize(context, config);
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(new File(Environment.getExternalStorageDirectory().getAbsoluteFile(),"Moe Studio"))
.setBaseDirectoryName("fresco_sample")
.setMaxCacheSize(200*1024*1024)//200MB
.build();
ImagePipelineConfig imagePipelineConfig = ImagePipelineConfig.newBuilder(this) // 配置ImagePipeline
.setMainDiskCacheConfig(diskCacheConfig)
.build();
Fresco.initialize(this,imagePipelineConfig);
注:使用fresco加载gif图片:
主要查看导入frsco的library的版本号,如果版本号是0.08.0,此时我们不需要单独添加gif图的依赖包,但是如果是0.11.0包及以上,我们就需要单独的添加依赖包进行gif图的加载。
参考文档:
http://www.fresco-cn.org/