Fresco是Facebook开源Android平台上一个强大的图片加载库
优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理和强大的功能,基本上能满足所有的日常使用场景。
缺点:整体比较大,不过目前的版本已做了拆分,你只需要导入你使用到的功能相关的库。从代码层面来说侵入性太强,体现在要使用它需要用Fresco的组件SimpleDraweeView替换掉Android原生图片显示组件ImageView,这也是很多人不愿意在项目中接入Fresco的主要原因。
依赖
implementation 'com.facebook.fresco:fresco:1.11.0' //普通图片
implementation 'com.facebook.fresco:animated-gif:1.10.0' //加载动态图片
布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_normal"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_circular"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_margin="5dp"
android:layout_below="@+id/simple_normal"
fresco:roundAsCircle="true"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_corners"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@+id/simple_circular"
fresco:roundedCornerRadius="8dp"
fresco:roundBottomLeft="true"
fresco:roundTopLeft="true"
fresco:roundBottomRight="true"
fresco:roundTopRight="true"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_border"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_margin="5dp"
android:layout_below="@+id/simple_corners"
fresco:roundAsCircle="true"
fresco:roundingBorderWidth="5px"
fresco:roundingBorderColor="#ff0"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_fuzzy"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_margin="5dp"
android:layout_below="@+id/simple_border"
fresco:roundAsCircle="true"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_local"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_margin="5dp"
android:layout_below="@+id/simple_fuzzy"
fresco:roundAsCircle="true"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_sd"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
fresco:roundAsCircle="true"
fresco:viewAspectRatio="1"/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple_dynamic"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_below="@+id/simple_sd"
android:layout_margin="5dp"
fresco:viewAspectRatio="1"/>
<!--fresco:actualImageScaleType="focusCrop" //加载得到的图片的缩放类型-->
<!--fresco:fadeDuration="1000" -->
<!--fresco:failureImage="@drawable/imgbg" //加载失败之后显示的图片-->
<!--fresco:failureImageScaleType="centerInside" //图片缩放类型-->
<!--fresco:placeholderImage="@drawable/imgbg" //占位图片(未加载之前显示的图片)-->
<!--fresco:placeholderImageScaleType="fitCenter" -->
<!--fresco:progressBarAutoRotateInterval="1000" //加载进度条图片旋转周期-->
<!--fresco:progressBarImage="@drawable/progress_bar" //加载进度条图片-->
<!--fresco:progressBarImageScaleType="centerInside"-->
<!--fresco:retryImage="@mipmap/ic_launcher" //提示重新加载的图片资源-->
<!--fresco:retryImageScaleType="centerCrop"-->
<!--fresco:backgroundImage="@color/colorWhite" //背景图片-->
<!--fresco:roundAsCircle="false" //是否要将图片剪切成圆形-->
<!--fresco:viewAspectRatio="1" //图片宽高比-->
<!--fresco:overlayImage="@drawable/overlay" //在图片上方覆盖一个图片资源-->
<!--fresco:pressedStateOverlayImage="@color/colorBlack"-->
<!--fresco:roundedCornerRadius="20dp" //圆角角度,-->
<!--fresco:roundTopLeft="true" //设置哪个角需要变成圆角-->
<!--fresco:roundTopRight="false"-->
<!--fresco:roundBottomLeft="false"-->
<!--fresco:roundBottomRight="true"-->
<!--fresco:roundWithOverlayColor="@color/colorWhite" //圆角部分填充色-->
<!--fresco:roundingBorderWidth="2dp" //边框宽度-->
<!--fresco:roundingBorderColor="@color/colorBlack" //边框填充色-->
<!--/>-->
</RelativeLayout>
Application 在Application中初始化
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//自定义缓存目录
File file = new File(Environment.getExternalStorageDirectory()+File.separator+"fresco_image");
/*
* Fresco.initialize(this); 初始化
*
* */
//添加自定义缓存目录
Fresco.initialize(this,
ImagePipelineConfig.newBuilder(this)
.setMainDiskCacheConfig(DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(file)
.build())
.build()
);//初始化
}
}
Activity fresco的使用
public class MainActivity extends AppCompatActivity {
private SimpleDraweeView
simple_normal,
simple_circular,
simple_corners,
simple_border,
simple_fuzzy,
simple_local,
simple_sd,
simple_dynamic;
String urlImage = "https://img4q.duitang.com/uploads/item/201304/27/20130427043538_wAfHC.jpeg";
String ss = "http://c.hiphotos.baidu.com/image/w%3D500/sign=64d9fd84bc003af34dbadc60052bc619/37d12f2eb9389b501dc8fddf8f35e5dde7116e03.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
}
simple_dynamic = findViewById(R.id.simple_dynamic);
simple_sd = findViewById(R.id.simple_sd);
simple_fuzzy = findViewById(R.id.simple_fuzzy);
simple_normal = findViewById(R.id.simple_normal);
simple_circular = findViewById(R.id.simple_circular);
simple_corners = findViewById(R.id.simple_corners);
simple_border = findViewById(R.id.simple_border);
simple_local = findViewById(R.id.simple_local);
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(Uri.parse(ss))
.setAutoPlayAnimations(true)
.build();
simple_dynamic.setController(controller);//动态图
simple_fuzzy.setImageURI(Uri.parse(urlImage)); //高斯模糊
simple_border.setImageURI(Uri.parse(urlImage)); //边框
simple_normal.setImageURI(Uri.parse(urlImage)); //正常图片
simple_circular.setImageURI(Uri.parse(urlImage)); //圆形图片
simple_corners.setImageURI(Uri.parse(urlImage)); //圆角图片
//加载drawable
Uri parse = Uri.parse("res://" + this.getPackageName() + "/" + R.drawable.yan);
simple_local.setImageURI(parse); //drawable图片
//加载Fresco默认缓存图片
FileBinaryResource resource= (FileBinaryResource) Fresco.getImagePipelineFactory().getMainFileCache().getResource(new SimpleCacheKey(urlImage.toString()));
File file = resource.getFile();
Uri uri = Uri.fromFile(file);
simple_sd.setImageURI(uri);
/**
* 以高斯模糊显示。
*
* draweeView View。
* url url.
* iterations 迭代次数,越大越魔化。
* blurRadius 模糊图半径,必须大于0,越大越模糊。
*/
showUrl(simple_fuzzy,urlImage,10,5);
}
private static void showUrl(SimpleDraweeView draweeView,String urlImage, int iterations, int blurRadius){
try {
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(urlImage))
.setPostprocessor(new IterativeBoxBlurPostProcessor(iterations, blurRadius))
.build();
AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(draweeView.getController())
.setImageRequest(request)
.build();
draweeView.setController(controller);
}catch (Exception e){
e.printStackTrace();
}finally {
}
}
}
效果图