Android图片加载框架——Picasso和Glide

       首先说Picasso,Picasso 是 Square 公司的杰作,名字叫「毕加索,充满文艺气息,意为加载图片就像画画一样,是一门艺术。Picasso 不仅具备加载图片的强大功能,还是如此的简洁。

Picasso默认的缓存分配大小特点:
  LRU缓存占应用程序可用内存的15%
  本地缓存占到硬盘空间的2%但不超过50M并且不小于5M(前提是这种情况只在4.0以上有效果,或者你能像OKHttp那样提供
  一个本地缓存库来支持全平台)
  Picasso默认开启3个线程来进行本地与网络之间的访问
  Picasso加载图片顺序, 内存–>本地–>网络

github地址
https://github.com/square/picasso

使用实例:

public class PicassoActivity extends AppCompatActivity {

    private ImageView mLoadImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loader_img);
        mLoadImg = (ImageView) findViewById(R.id.loadImg);
    }
    //点击事件
    public void loadImage(View view) {
//        basicLoad(ImageUrls.bigImages[4],mLoadImg);

//        loadAndSaveImage(ImageUrls.bigImages[5],mLoadImg);

        tranformationImage(ImageUrls.bigImages[6],mLoadImg);
    }

    //1.picasso的基本用法
    private void basicLoad(String url,ImageView iv){
        Picasso.with(this)    //context
               .load(url)     //图片加载地址
               .placeholder(R.mipmap.ic_launcher)    //图片加载中显示的页面
               .error(android.R.drawable.ic_menu_delete)   //图片记载失败时显示的页面
               .noFade()       //设置淡入淡出效果
               .resize(500,400)     //自定义图片加载的大小,会根据你传入的尺寸进行采样
               .centerCrop()    //图片会被裁剪,但是质量没有影响,等比例放大
//             .centerInside()   //图片完整展示,不会被压缩或挤压,一般是等比例缩小
//             .fit()      //智能展示图片,对于图片的大小和imageview的尺寸进行了测量,计算出最佳的大小和最佳的质量显示出来
               .into(iv);    //需要加载图片的控件
    }

    //2.Picasso 加载的图片的bitmap对象并且保存到磁盘当中
    private void loadAndSaveImage(String imgUrl,ImageView iv){
        Picasso.with(this)
                .load(imgUrl)
                .rotate(90f)   //简单的旋转处理,传入的数据大于0度小于360度
                .into(target);
    }
    //Target不能写成匿名内部类形式,垃圾回收器在你获取不到bitmap的引用时,会把他回收
    private Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            //加载成功后,得到bitmap对象,可以对其进行操作
            mLoadImg.setImageBitmap(bitmap);
            File file = new File(getExternalCacheDir().getAbsolutePath()+File.separator+"picasso.png");
            try {
                FileOutputStream fos = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {

        }
        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {

        }
    };

    //3.Picasso可以定制图片的处理
    private void tranformationImage(String imgPaht,ImageView iv){
        Picasso.with(this)
                .load(imgPaht)
                .transform(new CircleTransfromation())
                .into(iv);
    }
}
public class CircleTransfromation implements Transformation{
    @Override
    public Bitmap transform(Bitmap source) {
        //对于得到的bitmap进行操作
        //获取比较小的边作为正方形的边
        int size = Math.min(source.getWidth(),source.getHeight());
        int x = (source.getWidth()-size)/2;
        int y = (source.getHeight()-size)/2;

        Bitmap squareBitmap = Bitmap.createBitmap(source,x,y,size,size);
        if (squareBitmap!=source){
            //说明已经经过裁剪了
            source.recycle();
        }
        //把正方形位图作为画布,画圆形
        Bitmap bm = Bitmap.createBitmap(size,size,source.getConfig());
        Canvas canvas = new Canvas(bm);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(squareBitmap,BitmapShader.TileMode.CLAMP,
                BitmapShader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);

        float radius = size/2f;
        canvas.drawCircle(radius,radius,radius,paint);
        squareBitmap.recycle();
        return bm;
    }

    @Override
    public String key() {
        return "circle";
    }
}

效果:


         Google一位员工完成了Glide,Glide是基于 Picasso的,依然有保存了Picasso的简洁风格,但是在此做了大量优化与改进。Glide 默认的 Bitmap 格式是 RGB_565 格式,而Picasso默认的是 ARGB_8888 格式,这个内存开销要小一半。在磁盘缓存方面,Picasso只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide会根据你ImageView的大小来缓存相应大小的图片尺寸,比如你ImageView大小是200*200,原图是 400*400,而使用Glide 就会缓存 200*200规格的图,而Picasso只会缓存 400*400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,毕竟少了每次裁剪,重新渲染的过程。令人兴奋的是Glide 支持加载 Gif 动态图,而Picasso不支持该特性。

github地址https://github.com/bumptech/glide

使用实例:

public class GlideActivity extends AppCompatActivity {

    private ImageView mLoadImg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loader_img);
        mLoadImg = (ImageView) findViewById(R.id.loadImg);
    }

    public void loadImage(View view) {
        basicLoad(ImageUrls.newImageUrls[0],mLoadImg);
    }

    //1.glide的基本用法
    private void basicLoad(String imgPath,ImageView iv){
        Glide.with(this)   //使得glide更容易使用,因为能接收context,activity,fragment对象
             .load(imgPath)
//             .asGif()      //判断加载的url资源是否是gif格式的资源
             .priority(Priority.HIGH)    //设置优先级
             .placeholder(R.mipmap.ic_launcher)    //加载中显示的图片
             .error(android.R.drawable.ic_menu_delete)//加载失败显示的图片
             .centerCrop()
//             .fitCenter()    //缩放图像,整个显示在控件,尽可能的填满
            .into(iv);
    }

    //2.获取glide加载bitmap的方法,能够显示并存储图片
    private void loadAndSaveImage(String url,ImageView iv){

        Glide.with(this)
                .load(url).asBitmap().into(target);
    }

    SimpleTarget target = new SimpleTarget<Bitmap>(300,600) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            mLoadImg.setImageBitmap(resource);

            File file = new File(getExternalCacheDir().getAbsolutePath()+File.separator+"glide.png");
            try {
                FileOutputStream fos = new FileOutputStream(file);
                resource.compress(Bitmap.CompressFormat.PNG,100,fos);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    };
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值