美文网首页
Picasso框架的运用

Picasso框架的运用

作者: 日丶月丶明 | 来源:发表于2017-08-31 17:32 被阅读55次

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

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

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

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

    <uses-permission android:name="android.permission.INTERNET"/>
    

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

     Picasso.with(this).load(url).into(image);
    
    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);
    
    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);
    
    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);
    
    
    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);
    
    Screenshot_2017-08-31-17-30-15.png

    相关文章

      网友评论

          本文标题:Picasso框架的运用

          本文链接:https://www.haomeiwen.com/subject/rvuqjxtx.html