Glide是一个非常成熟的加载图片的库,她可以从多个源加载图片,如网络、本地、Uri等,更重要的是内部封装了非常好的缓存机制,并且在处理照片的时候能保持一个低的内存消耗,被广泛用在开源项目中。
Glide介绍:专注于处理平滑滑动的图片类库,默认使用HttpUrlConnection下载图片,支持设置渐渐显示的动画,支持设置加载中的图片
Picasso介绍:介绍:Square开源的比较早的图片加载类库,自动处理adapter中的ImageView的回收时取消下载图片,支持加载多种来源的图片,比如网络,sd卡,res资源,支持设置占位图片,支持对图片的自定义处理
Fresco介绍:Facebook开源的专注于优化java堆内存,最大程度减少OOM,在Android4.4以及以下,将图片存储在Android的一块特殊的内存区域,这会让图片处理更加快速,支持Gif和WebP格式的图片
Picasso直接添加依赖,,,Glide要依赖V4包,
Picasso的with只能传入context,Glide的with既可以传context,又可以传Activity或者Fragment,好处是图片加载和Activity或者Fragment保持一致,Activity已经暂停,但是图片确还在加载的情况.
Picasso默认的格式是ARGB_8888,而Glide默认的格式是RGB_565,所以Glide的加载图片的质量不如Picasso
Picasso在图片加载过程中会有一定的延迟,因为它在加载到imageview的时候总是需要调整大小,而Glide的优点就是可以加快图片加载的速度
Glide可以加载GIF图片,而用Picasso加载的GIF图片是不会动的
Glide库文件大小为430KB,方法有2678个
而Picasso的大小大约为118KB,方法有480个
步骤:1添加依赖 2在清单文件中写权限 3设置布局管理器 4设置数据
1添加依赖Glide和V4包(如果没有)
compile 'com.github.bumptech.glide:glide:3.7.0'
2在清单文件中写权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
添加RecyclerView
.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3设置布局管理器
recyclerview.setLayoutManager(new LinearLayoutManager(this));
4.设置数据
recyclerview.setAdapter(new MyAdapter());
class MyAdapter extends RecyclerView.Adapter<MyHolder> {
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(parent.getContext(), R.layout.adapter_iamge, null);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
Glide.with(holder.itemView.getContext())
.load(Constants.IMAGES[position])
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.error)
.centerCrop()
.crossFade(1000)
.into(holder.ivImage);
}
@Override
public int getItemCount() {
return Constants.IMAGES.length;
}
}
class MyHolder extends RecyclerView.ViewHolder {
@InjectView(R.id.iv_image)
ImageView ivImage;
public MyHolder(View itemView) {
super(itemView);
ButterKnife.inject(this, itemView );
}
}
5将图片格式ARGB_565更改为ARGB_8888 实现GlideModule
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(Context context, Glide glide) {
}
Picasso的使用
1添加依赖
compile 'com.squareup.picasso:picasso:2.5.2'
2使用Picasso加载图片
Picasso.with(holder.itemView.getContext())
.load(Constants.IMAGES[position])
.placeholder(R.mipmap.ic_launcher)//默认图片
.error(R.mipmap.error)//加载失败图片
.centerCrop()//按照图片的原始尺寸比例进行缩放,图片居于视图中间
//如果不设置resize(120,120),则Picasso会加载整个图片,显然这样消耗的内存比较大,一般都需要指定一下,而Glide内部已经默认参考了控件的宽高来进行缩放了。
.resize(200,180)//必须设置图片大小
.into(holder.ivImage)
Fresco的使用
1添加依赖Fresco
compile 'com.facebook.fresco:fresco:0.11.0'
2将布局中的ImageView替换成SimpleDraweeView
<com.facebook.drawee.view.SimpleDraweeView
xmlns:fresco="http://schemas.android.com/apk/res-auto"
fresco:fadeDuration="1000"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImageScaleType="fitCenter"
fresco:placeholderImage="@mipmap/ic_launcher"
fresco:failureImage="@mipmap/error"
fresco:progressBarImage="@mipmap/progress"
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"
fresco:roundAsCircle="true"
android:id="@+id/iv_image"
android:layout_width="200dp"
android:layout_height="180dp"
/>
3初始化Fesco, 必须放在 setContentView(R.layout.activity_image_load);上面,不初始化会报错android.view.InflateException: Binary XML file line #7: Error inflating class com.facebook.drawee.view.SimpleDraweeView
Fresco.initialize(GlideActivity.this)
4 Fresco加载图片
holder.ivImage.setImageURI(Constants.IMAGES[position])
5Fresco注意事项
fresco:fadeDuration="1000"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@mipmap/ic_launcher"
fresco:placeholderImageScaleType="fitCenter"
fresco:retryImageScaleType="centerCrop"
resco:progressBarImage="@mipmap/progress"
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"
fresco:roundAsCircle="true"
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"