Picasso框架的运用

picasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存功能。
当然使用起来也是非常的简单。

首先我们要依赖一下jar包:

compile 'com.squareup.picasso:picasso:2.5.2'  

加载网络图片当然要添加网络权限:


最后只要调用一段简单的代码就可以,load传入图片链接,into传入图片控件:

 Picasso.with(this).load(url).into(image);
Picasso框架的运用_第1张图片
Screenshot_2017-08-31-15-24-58.png

load里面可以传入url、file、String。当然传入String框架底层还是会把他转成url:

public RequestCreator load(String path) {  
    if (path == null) {  
      return new RequestCreator(this, null, 0);  
    }  
    if (path.trim().length() == 0) {  
      throw new IllegalArgumentException("Path must not be empty.");  
    }  
    return load(Uri.parse(path));  
  } 

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

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

转换图片以适应布局大小并减少内存占用,resize()方法传入的是像素值:

Picasso.with(this).load(url).resize(500, 500).centerCrop().into(image);
Picasso框架的运用_第2张图片
Screenshot_2017-08-31-15-34-03.png

自定义转换图片的大小,key方法里返回值不能为null,不然会报错:

 Transformation transformation = new Transformation() {
            @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:要截取的图片,x:起始x坐标,y:起始y坐标,size:截取图片的宽度,size:截取图片的高度
                Bitmap bp = Bitmap.createBitmap(bitmap,x,y,size,size);
                if (bp != bitmap) {
                    bitmap.recycle();
                }
                return bp;
            }

            @Override
            public String key() {
                return "";
            }
        };
// 调用transformation
Picasso.with(this).load(url).transform(transformation).into(image);
Picasso框架的运用_第3张图片
Screenshot_2017-08-31-16-10-00.png

Picasso没有自带圆角属性,如果你需要圆形图片,那就只能自己转换:

Transformation transformation = new Transformation() {
            @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:要截取的图片,x:起始x坐标,y:起始y坐标,size:截取图片的宽度,size:截取图片的高度
                Bitmap bp = Bitmap.createBitmap(bitmap, x, y, size, size);
                if (bp != bitmap) {
                    bitmap.recycle();
                }
                Bitmap cansMap = Bitmap.createBitmap(size, size, bitmap.getConfig());
                Canvas cav = new Canvas(cansMap);
                Paint paint = new Paint();
                /**
                 * Shader.TileMode:(一共有三种)
                 * CLAMP  :如果渲染器超出原始边界范围,会复制范围内边缘染色。
                 * REPEAT :横向和纵向的重复渲染器图片,平铺。
                 * MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。
                 * */
                BitmapShader bShader = new BitmapShader(bp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
                paint.setShader(bShader);
                paint.setAntiAlias(true);
                float r = size / 2f;
                cav.drawCircle(r, r, r, paint);
                bp.recycle();
                return cansMap;
            }

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

        Picasso.with(this).load(url).transform(transformation).error(R.mipmap.ic_launcher).into(image);

Picasso框架的运用_第4张图片
Screenshot_2017-08-31-17-13-38.png

动态设置图片弧角:

  class PicassoTransformation implements Transformation {
        private final int radius;
        private final int margin;

        /**
         * 第一个参数是弧度
         * 第二个参数是图片缩放的比例
         * */
        public PicassoTransformation(final int radius, final int margin) {
            this.radius = radius;
            this.margin = margin;
        }

        @Override
        public Bitmap transform(Bitmap source) {
            final Paint paint = new Paint();
            paint.setAntiAlias(true);
            BitmapShader bitmapShader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            paint.setShader(bitmapShader);

            Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
            RectF rectF = new RectF(margin, margin, source.getWidth() - margin, source.getHeight() - margin);
            canvas.drawRoundRect(rectF, radius, radius, paint);

            if (source != output) {
                source.recycle();
            }
            return output;
        }

        @Override
        public String key() {
            return "rounded(radius=" + radius + ", margin=" + margin + ")";
        }
    }

  //调用
  PicassoTransformation picassoTransformation = new PicassoTransformation(100,100);
  Picasso.with(this).load(url).transform(picassoTransformation).error(R.mipmap.ic_launcher).into(image);
Picasso框架的运用_第5张图片
Screenshot_2017-08-31-17-30-15.png

你可能感兴趣的:(Picasso框架的运用)