Fresco -- Facebook发布的一款开源框架(Android图片加载库)
1)添加依赖库。
studio添加fresco的jar包依赖使用括号里面的就行(compil 'com.facebook.fresco:fresco:0.8.1') 加载gif用太高版本的Fresco显示效果不会动
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.facebook.fresco:fresco:0.8.1'
}
2)如果多次用到Fresco建议在 Application 初始化,其余情况也必须要在setContentView() 之前调用初始化:
package com.example.frescodemo;
import android.app.Application;
import com.facebook.drawee.backends.pipeline.Fresco;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
public class MainActivity extends AppCompatActivity { private SimpleDraweeView sdv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Fresco.initialize(this);//Fresco的初始化,必须调用在setContentView之前 setContentView(R.layout.activity_main);
} }
如果设置gif图只需要调用setAutoPlayAnimations(true) ,使用gif图要注意开源库版本选低一点,目前高版本的效果只显示不会动:
3)如果加载的是一张网络图片,需要获得网络权限
<uses-permission android:name="android.permission.INTERNET"/>
4)注意:Fresco 不支持相对路径的URI. 所有的URI都必须是绝对路径,并且带上该URI的scheme。
URIs的使用:
类型 Scheme 示例 远程图片 http://,
https://
HttpURLConnection
或者参考 使用其他网络加载方案本地文件 file://
FileInputStream
Content provider content://
ContentResolver
asset目录下的资源 asset://
AssetManager
res目录下的资源 res://
Resources.openRawResource
res 示例:Uri uri = Uri.parse("res://包名(实际可以是任何字符串甚至留空)/" + R.drawable.ic_launcher);
5)控件名字,命名空间都要注意使用,Fresco不同于其它几个图片加载库,它是基于自定义控件的,要使用控件SimpleDraweeView来显示图片,
注意,控件不支持宽高同时设置为wrap_content,默认强制设置宽高,否则不显示图片
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:fresco="http://schemas.android.com/apk/res-auto" //注意添加命名空间 android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.frescodemo.MainActivity">
<com.facebook.drawee.view.SimpleDraweeView android:layout_width="300dp" android:layout_height="300dp" android:id="@+id/main_simple_drawee_view" fresco:placeholderImage="@mipmap/ic_launcher"/> </RelativeLayout>
在XML中使用SimpleDraweeView:
给出一个完整的示例:
说明:必须声明 android:layout_width 和 android:layout_height,否则将无法正确加载图像,另外不支持 wrap_content 属性,但也有例外的时候,如果想固定控件的宽高比,则可以使用wrap_content,并通过在xml代码中设置fresco:viewAspectRatio="小数"或者在Java代码中设置mSimpleDraweeView.setAspectRatio(1.33f);即可。
上面的ImageScaleType有下面一些缩放类型:
类型 | 描述 |
center | 居中,无缩放 |
centerCrop | 保持宽高比缩小或放大,是的两边都大于或等于边界,且宽和高契合显示边界,居中显示 |
focusCrop | 同centerCrop,但居中点不是中点,而是指定的某个点 |
centerInside | 缩放图片使两边都在显示边界内,居中显示。和fitCenter不同,不会对图片进行放大。如果尺寸大于显示边界,则保持宽高比例缩小图片。 |
fitCenter | 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,且宽或高契合显示边界,居中显示。 |
fitStart | 同上,但不居中,和显示边界左上对齐。 |
fitEnd | 同fitCenter,但不居中,和显示边界右下对齐。 |
fitXY | 不保存宽高比,填充满显示边界。 |
none | 如果要使用tile mode显示,则需要设置为none |
在Java中自定义显示图
一般情况下,在XML设置显示效果即可, 如果想更多定制化,可以这样:
创建一个 builder 然后设置给 SimpleDraweeView:
注意:请不要多次调用setHierarchy,即使这个View是可回收的。创建 DraweeHierarchy 的较为耗时的一个过程,应该多次利用。修改 DraweeHierarchy
DraweeHierarchy 的一些属性可以在运行时改变。
要改变这些属性,首先获取一个引用:
GenericDraweeHierarchy hierarchy = mSimpleDraweeView.getHierarchy();
修改占位图
修改占位图为资源id:hierarchy.setPlaceholderImage(R.drawable.placeholderId);
或者修改为一个 Drawable:Drawable drawable; hierarchy.setPlaceholderImage(drawable);
改变图像的显示
修改缩放类型:
hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE);
如果你选择缩放类型为 focusCrop,需要指定一个居中点:hierarchy.setActualImageFocusPoint(point);
你可以为图像添加一个 color filter:
ColorFilter filter;
// 创建filter
hierarchy.setActualImageColorFilter(filter);
圆角
除了圆角显示方式(原来为圆角的不能修改为圆圈,反之亦然),其他圆角相关的呈现参数, 具体参见这里 是可以动态修改的。
如下: 获取DraweeHierarchy的圆角显示参数,修改圆角半径为10。
RoundingParams roundingParams = hierarchy.getRoundingParams();
roundingParams.setCornersRadius(10);
hierarchy.setRoundingParams(roundingParams);
有时候需要加载很多图片,这个时候如果网络情况不是很好的情况下,一直显示占位图,体验也不是很好,我们可以先显示一个低分辨率的图片,等到大图加载完成之后,在显示真正的图片。
DraweeController controller = Fresco.newDraweeControllerBuilder() .setLowResImageRequest(ImageRequest.fromUri(lowResUri)) .setImageRequest(ImageRequest.fromUri(highResUri)) .setOldController(draweeView.getController()) .build(); draweeView.setController(controller);当然如果你想监听加载的过程,就加一个ControllerListen
//写一个监听器 监听图片加载 ControllerListener listener = new BaseControllerListener(){ /** * 当图片加载成功时会执行的方法 * @param id * @param imageInfo * @param animatable */ @Override public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) { super.onFinalImageSet(id, imageInfo, animatable); } /** * 图片加载失败时调用的方法 * @param id * @param throwable */ @Override public void onFailure(String id, Throwable throwable) { super.onFailure(id, throwable); } /** * 如果图片使用渐进式,这个方法将会被回调 * @param id * @param throwable */ @Override public void onIntermediateImageFailed(String id, Throwable throwable) { super.onIntermediateImageFailed(id, throwable); } }; DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(uri) .setAutoPlayAnimations(true) .setControllerListener(listener) .build(); sdv.setController(controller);
以上内容仅为网络摘抄整理,方便日后使用