Facebook 出品的一个强大的图片加载组件 Fresco ,这篇文章将只介绍Fresco的基本使用。
引入Fresco
使用 Android Studio添加依赖:
dependencies {
// 其他依赖
compile 'com.facebook.fresco:fresco:1.5.0'
}
开始使用 Fresco
在加载图片之前,你必须初始化Fresco类。你只需要调用Fresco.initialize一次即可完成初始化,在 Application 里面做这件事再适合不过了
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
在XML中加入加入SimpleDraweeView:
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
- 必须设置Drawee的宽高属性或者设置一个宽/高,再设置
fresco的图片来源有很多方式,支持的Uri如下:
Fresco 不支持 相对路径的URI. 所有的 URI 都必须是绝对路径,并且带上该 URI 的 scheme。
//自定义封装了加载图片的工具类
public final class ImageLoadUtil {
private static int OPENGL_MAX_SIZE = 0;
/**
* 最基础的图片加载方法
*
* @param imageView 需要加载图片的控件
* @param uri 图片的路径
*
* @link 支持的Uri{https://www.fresco-cn.org/docs/supported-uris.html}
*/
public static void loadImgByUri(SimpleDraweeView imageView, String uri) {
if (imageView != null && !TextUtils.isEmpty(uri)) {
if (uri.startsWith("file://")) {
loadImgByFile(imageView, uri.substring("file://".length()));
} else {
imageView.setImageURI(uri);
}
}
}
public static void loadImgByFile(SimpleDraweeView imageView, String path) {
if (imageView != null && !TextUtils.isEmpty(path)) {
imageView.setImageURI(Uri.parse("file://" + path));
}
}
public static void loadImgByNet(SimpleDraweeView imageView, String url) {
if (imageView != null && !TextUtils.isEmpty(url)) {
imageView.setImageURI(Uri.parse(url));
}
}
public static void loadImgByContentProvider(SimpleDraweeView imageView, String path) {
if (imageView != null && !TextUtils.isEmpty(path)) {
imageView.setImageURI(Uri.parse("content://" + path));
}
}
public static void loadImgByAsset(SimpleDraweeView imageView, String path) {
if (imageView != null && !TextUtils.isEmpty(path)) {
imageView.setImageURI(Uri.parse("asset://" + path));
}
}
public static void loadImgByResources(SimpleDraweeView imageView, int resourcesId) {
if (imageView != null) {
imageView.setImageURI(Uri.parse("res://aaa/" + resourcesId));
}
}
public static void loadImgByBase64(SimpleDraweeView imageView, String base64, String mimeType) {
if (imageView != null && !TextUtils.isEmpty(mimeType) && !TextUtils.isEmpty(base64)) {
imageView.setImageURI(Uri.parse("data:" + mimeType + ";" + base64));
}
}
EG:使用Fresco加载网络图片,逐步说明XML属性的使用
在XML中使用Drawees
//父布局加入命名空间
xmlns:fresco="http://schemas.android.com/apk/res-auto"
-
占位图—placeholderImage:
在此之前我们需要一张占位图 icon_placeholder.png 大家右键另存为即可:
修改我们的 activity_main.xml :
代码说明:
MainActivity 无需修改,运行一下:
-
正在加载图—progressBarImage:
在此之前我们需要一张正在加载图 icon_progress_bar.png 大家右键另存为即可:
修改我们刚刚书写的 activity_main.xml :
代码说明:
更改我们的 MainActivity 里代码:
public class MainActivity extends AppCompatActivity {
private SimpleDraweeView simpleDraweeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fresco.initialize(this);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
//创建SimpleDraweeView对象
simpleDraweeView = (SimpleDraweeView) findViewById(R.id.main_sdv);
//创建将要下载的图片的URI
Uri imageUri = Uri.parse("http://my.csdn.net/uploads/avatar/4/E/8/1_y1scp.jpg");
//开始下载
simpleDraweeView.setImageURI(imageUri);
}
}
代码分析:
运行效果图:
正在加载图本身是不可以转的,但是呢,加上了fresco:progressBarAutoRotateInterval="5000",属性,那么它就可以旋转了;可以看到,正在加载图一闪而过,这是因为我们加载的图片很小,网络也很好。
-
失败图—failureImage:
在此之前我们需要一张正在加载图 icon_failure.png 大家右键另存为即可:
修改我们刚刚书写的 activity_main.xml :
代码分析:
修改我们的 MainActivity 里代码:
public class MainActivity extends AppCompatActivity {
private SimpleDraweeView simpleDraweeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fresco.initialize(this);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
//创建SimpleDraweeView对象
simpleDraweeView = (SimpleDraweeView) findViewById(R.id.main_sdv);
//创建将要下载的图片的URI
Uri imageUri = Uri.parse("http://my.csdn.net/uploads/avatar_y1scp.jpg");
//开始下载
simpleDraweeView.setImageURI(imageUri);
}
}
代码说明:
运行效果:
-
重试图—retryImage:
此之前我们需要一张正在加载图 icon_retry.png 大家右键另存为即可:
修改我们刚刚书写的 activity_main.xml :
代码分析:
修改我们的 MainActivity 里代码:
public class MainActivity extends AppCompatActivity {
private SimpleDraweeView simpleDraweeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fresco.initialize(this);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
//创建SimpleDraweeView对象
simpleDraweeView = (SimpleDraweeView) findViewById(R.id.main_sdv);
//创建将要下载的图片的URI
Uri imageUri = Uri.parse("http://my.csdn.net/uploads/avatar_y1scp.jpg");
//开始下载
simpleDraweeView.setImageURI(imageUri);
//创建DraweeController
DraweeController controller = Fresco.newDraweeControllerBuilder()
//加载的图片URI地址
.setUri(imageUri)
//设置点击重试是否开启
.setTapToRetryEnabled(true)
//设置旧的Controller
.setOldController(simpleDraweeView.getController())
//构建
.build();
//设置DraweeController
simpleDraweeView.setController(controller);
}
}
运行效果:
注意:
重复加载4次还是没有加载出来的时候才会显示 failureImage(失败图) 的图片
- 淡入淡出动画—fadeDuration:
修改我们刚刚书写的 activity_main.xml :
MainActivity 中的代码无需修改。
运行效果:
重试+进度图+失败图
进度图+正确图
- 背景图—backgroundImage:
这里呢,我们的背景图采用的是一个系统所提供的颜色中的一种。
修改我们刚刚书写的 activity_main.xml :
代码说明:
MainActivity 中的代码无需修改,运行效果:
- 叠加图—overlayImage:
这里呢,我们的背景图采用的是一个系统所提供的颜色中的一种。
修改我们刚刚书写的 activity_main.xml :
MainActivity 中的代码无需修改。
运行效果:
从运行效果来看,叠加图在最上面,覆盖了下面的图。
- 圆形图—roundAsCircle:
一行代码搞定圆形图:设置roundAsCircle为true;
修改我们刚刚书写的 activity_main.xml :
代码说明:
运行效果:
可以看到,从图片开始加载一直到图片下载完毕,整个图像都是圆形的。
- 圆角图—roundedCornerRadius:
修改我们刚刚书写的 activity_main.xml :
左上角是否为圆角fresco:roundTopLeft="false" | 右上角是否为圆角fresco:roundTopRight="false" |
---|---|
|
|
左下角是否为圆角fresco:roundBottomLeft="false" | 右下角是否为圆角fresco:roundBottomRight="false" |
|
|
代码说明:
运行效果:
可以看到,从图片开始加载一直到图片下载完毕,整个图像都是圆角的。
左上角是否为圆角fresco:roundTopLeft="false" | 右上角是否为圆角fresco:roundTopRight="false" |
---|---|
|
|
左下角是否为圆角fresco:roundBottomLeft="false" | 右下角是否为圆角fresco:roundBottomRight="false" |
|
|
当我们同时设置图像显示为圆形图像和圆角图像时,只会显示为圆形图像。
- 圆形圆角边框宽度及颜色—roundingBorder:
修改我们刚刚书写的 activity_main.xml :
|
|
代码说明:
MainActivity 中的代码无需修改。运行效果(左边显示的是带边框的圆形图像,右边显示的是带边框的圆角图像):
|
|
- 圆形或圆角图像底下的叠加颜色—roundWithOverlayColor:
修改我们刚刚书写的 activity_main.xml :
代码说明:
运行效果(左边为圆形效果,右边为圆角效果):
- 缩放类型—ScaleType:
类型 | 描述 |
---|---|
center | 居中,无缩放 |
centerCrop | 保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示 |
focusCrop | 同centerCrop, 但居中点不是中点,而是指定的某个点 |
centerInside | 使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片。 |
fitCenter | 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示 |
fitStart | 同上。但不居中,和显示边界左上对齐 |
fitEnd | 同fitCenter, 但不居中,和显示边界右下对齐 |
fitXY | 不保存宽高比,填充满显示边界 |
none | 如要使用tile mode显示, 需要设置为none |
- 参考链接:
http://blog.csdn.net/y1scp/article/details/49245535