Picasso和Glide的图片加载与缓存

picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能。仅仅只需要一行代码就能完全实现图片的异步加载:

Picasso.with(context).load("要获取的图片网址").into(imageView);

Glide是Google官方推荐使用的图片加载缓存的框架,也仅仅只需要一行代码即可实现图片的加载
Glide.with(this).load("要获取的图片网址").placeholder(R.drawable.ic_launcher).into(image1);
两个框架用起来功能相似,在我看来,相似度达到了基本上90%以上。可以说Glide是在Picasso的基础上新增加了一点点其他的新的功能,在我看来Glide比Picasso功能强大一些,推荐使用Glide框架(纯属个人意见)。
导入库
Picasso和Glide都在jcenter上。在项目中添加依赖非常简单:
Picasso

dependencies {  
    compile 'com.squareup.picasso:picasso:2.5.1'  
} 

Glide

dependencies {  
    compile 'com.github.bumptech.glide:glide:3.5.2'  
    compile 'com.android.support:support-v4:22.0.0'  
} 

或者直接下载jia包导入到自己的项目中去
Picasso简单用法
①直接加载图片

RequestCreator p =          Picasso.with(this).load(url);
p.into(image1);

②转换图片以适应布局大小并减少内存占用
Picasso.with(this).load(url)
.resize(500, 500).centerCrop().into(image2);

③Place holders-空白或者错误占位图片:picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。

Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
.into(imageView);

④资源文件的加载:除了加载网络图片picasso还支持加载Resources, assets, files, content providers中的资源文件。

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load(new File(...)).into(imageView2);

⑤你还可以自定义转换:

class CropSqureTransformation implements Transformation{
    @Override
    public String key() {
        return "square()";
    }
    @Override
    public Bitmap transform(Bitmap bitmap) {
        int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
        int x = (bitmap.getWidth() - size)/2;
        int y = (bitmap.getHeight() - size)/2;
        Bitmap result = bitmap.createBitmap(bitmap, x, y, size, size);
        if(result != bitmap){
            bitmap.recycle();
        }
        return result;
    }
}
```⑥Adapter的重用会被自动检测到,Picasso会取消上次的加载





<div class="se-preview-section-delimiter">div>

这里写代码片
“`

@Override public void getView(int position, View convertView, ViewGroup parent) {
  SquaredImageView view = (SquaredImageView) convertView;
  if (view == null) {
    view = new SquaredImageView(context);
  }
  String url = getItem(position);
  Picasso.with(context).load(url).into(view);
}

Glide基本用法
①加载图片,对于较大的图片,加载未能及时显示,设置等待时的图片用placeholder()

Glide.with(this)
        .load(url)
        .placeholder(R.drawable.ic_launcher)
        .into(image1);  

②使用centerCrop是利用图片图填充ImageView设置的大小,如果ImageView的Height是match_parent则图片就会被拉伸填充

Glide.with(this)
        .load(url)
        .centerCrop().into(image2);

③当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:

Glide.with(this).load(url).error(R.drawable.ic_launcher).into(image3);

④ 如果使用的是ListView,可以直接在Adapter的getView方法中使用:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (null == convertView) {
            //.....
        }
        Glide
            .with(context)
            .load(imageUrls[position])
            .into(holder.imageView);
        return convertView;
    }

⑤显示gif动画:

Glide   .with( context ).load( gifUrl )
    .asGif() //判断加载的url资源是否为gif格式的资源
    .error( R.drawable.full_cake )
    .into( imageViewGif );

⑥缓存策略

Glide  
    .with( context )
    .load( Images[0] )
    .skipMemoryCache( true ) //跳过内存缓存
    .into( imageViewInternet );
Glide  
    .with( context )
    .load( images[0] )
    .diskCacheStrategy( DiskCacheStrategy.NONE ) //跳过硬盘缓存
    .into( imageViewInternet );

DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

⑦优先级,设置图片加载的顺序:
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE

private void loadImageWithHighPriority() {  
    Glide
        .with( context )
        .load( mages[0] )
        .priority( Priority.HIGH )
        .into( imageViewHero );
}
private void loadImagesWithLowPriority() {  
    Glide
        .with( context )
        .load( images[1] )
        .priority( Priority.LOW )
        .into( imageViewLowPrioLeft );
    Glide
        .with( context )
        .load( images[2] )
        .priority( Priority.LOW )
        .into( imageViewLowPrioRight );
}
*好了,写到这里Picasso和Glide的基本用法差不多写完了,通过上面的学习大概知道了Picasso和Glide的基本用法。Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏,Picasso的库的内存小一些,并且显示的图片的平滑要优于Glide,当然Glide可以去设置一下也可以是效果达到Picasso。至于你喜欢那个框架,那就取决于你个人的态度了,我的建议是根据自己的需求选择合适的,因为两框架都各有各的优势和不足。
最后谢谢大家的支持,祝大家身体健康,工作顺利*

你可能感兴趣的:(android,图片,imageview,缓存,square)