Android 之 Picasso使用

Picasso使用
简介:

Picasso是Square公司出品的一款强大的Android图片缓存库,可以实现图片的加载与缓存功能。

功能:

Picasso采用链式调用的方式实现了加载图片和自动缓存功能,同时,在图片的处理上也做的相当好,可以自己根据相应的需求来对图片进行变换大小和进行旋转,还提供了Transformation接口,可以自行处理Bitmap相关的操作,在Adapter中的使用也相当流畅。

使用:

Picasso 主要采用链式的方法,让图片从加载到设置到相关的View中串联起来,主要使用Picasso.with(context).load(url).into(imageView),同时,可以在链式操作中,load(url)和into(imageView)之间设置相关的参数来实现一些基础要求,例如:设置加载时的图片,或者加载失败的图片等等。同时还可以调用resize()等方法将图片转化并且占用较少内存。Picasso在加载时也提供了很多cancelTag(Object tag),pauseTag(Object tag),resumeTag(Object tag)等相关对Picasso进行暂停,resume相关的操作,可以控制Picasso更好的处理图片。

缓存:

Picasso是采用了OkHttp下载,那么Picasso一定使用了

client.setCache(new com.squareup.okhttp.Cache(cacheDir, maxSize));
public OkHttpDownloader(final Context context) {  this(Utils.createDefaultCacheDir(context)); 
}
static File createDefaultCacheDir(Context context) {
    File cache = new File(context.getApplicationContext().getCacheDir(), PICASSO_CACHE);
    if (!cache.exists()) {
      //noinspection ResultOfMethodCallIgnored
      cache.mkdirs();
    }
    return cache;
  }

而context.getApplicationContext().getCacheDir() ;获得缓存目录
getCacheDir()方法用于获取/data/data/(application package)/cache目录
getFilesDir()方法用于获取/data/data/(application package)/files目录
Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
private static final String PICASSO_CACHE = “picasso-cache”;
ok,那么缓存目录就在 /data/data/(application package)/cache/picasso-cache/下边

需求:

很多时候,我们不可能每次都要去设置placeholderResId,errorResId等,这样不仅增加代码的数量,还会使Picasso的链式变得很长,如果有可能的话,可以对Picasso进行一些基础的封装。
Picasso.with(context) 源码中显示的context.getApplicationContext(),所以在初始化的时候,我们可以在Application类中直接实现,然后在Application中对placeholderResId,errorResId等进行相应的设置。

public class MyPicasso {

    private static MyPicasso instance;

    private static Picasso picasso;

    //记载一些Picasso参数的对象
    private static PicassoBean bean;

    public MyPicasso(Context context) {
        picasso = Picasso.with(context);
        bean = new PicassoBean();
    }

    /***
     * 在Application中初始化,在之后的调用中可以直接使用Util进行使用
     *
     * @param context 上下文
     *                <p>根据Picasso的源码{@link Picasso.Builder#Builder(android.content.Context)}可知,
     *                Picasso初始化即为with(Context context)这里的Context就是去获取相关的Application
     *                级的Context,同时,初始化为单例模式,及时以后再去调用with(Context context),
     *                也不会再去{@link Picasso.Builder#build()}</p>
     */
    public static void init(Context context) {
        if (instance == null) {
            synchronized (MyPicasso.class) {
                if (instance == null) {
                    instance = new MyPicasso(context);
                }
            }
        }
    }

    /**
     * 获得定义的PicassoBean,便于设置一些参数
     **/
    public static PicassoBean getBean() {
        if (bean != null) {
            return bean;
        } else {
            throw new NullPointerException("PicassonBean is null");
        }
    }

    /**
     * 加载默认数据,对图像不做处理
     *
     * @param object
     * @param iv
     */
    public static void inject(Object object, ImageView iv) {
        inject(object, iv, null);
    }

    /**
     * 加载圆角图像,
     *
     * @param object
     * @param iv
     * @param rangle 圆角角度,单位px
     */
    public static void inject(Object object, ImageView iv, int rangle) {
        inject(object, iv, new RangleTransForm(rangle));
    }

    /**
     *  加载圆形图片
     * @param object
     * @param iv
     * @param isCircle 是否为圆形图片
     */
    public static void inject(Object object, ImageView iv, boolean isCircle) {
        if (isCircle) {
            inject(object, iv, new CircleTransForm());
        } else {
            inject(object,iv);
        }
    }

    /**
     * 加载数据
     *
     * @param object 需传入相关的数据,根据类型来执行不同操作
     * @param iv     需要注入的相关的ImageView
     */
    private static void inject(Object object, ImageView iv, Transformation transformation) {
        if (object instanceof Integer) {
            initArg(picasso.load((Integer) object), transformation).into(iv);
        } else if (object instanceof String) {
            initArg(picasso.load((String) object), transformation).into(iv);
        } else if (object instanceof Uri) {
            initArg(picasso.load((Uri) object), transformation).into(iv);
        } else if (object instanceof File) {
            initArg(picasso.load((File) object), transformation).into(iv);
        } else {
            throw new IllegalArgumentException("Please input correct object arg ");
        }
    }

    /**
     * 加载一些配置
     *
     * @param creator
     * @param transformation 方便自定义一些有特点的图像
     * @return
     */
    private static RequestCreator initArg(RequestCreator creator, Transformation transformation) {
        if (bean.placeholderResId != 0) {
            creator.placeholder(bean.placeholderResId);
        }
        if (bean.errorResId != 0) {
            creator.error(bean.errorResId);
        }
        if (transformation != null) {
            creator.transform(transformation);
        } else {
            if (bean.transformation != null) {
                creator.transform(bean.transformation);
            }
        }
        if (bean.policy != null) {
            creator.memoryPolicy(bean.policy);
        }
        if (bean.networkPolicy != null) {
            creator.networkPolicy(bean.networkPolicy);
        }
        return creator;
    }

    /**
     * 清除缓存
     *
     * @param object 需传入相关的数据,根据类型来执行不同操作
     */
    public static void invalidate(Object object) {
        if (object instanceof String) {
            picasso.invalidate((String) object);
        } else if (object instanceof Uri) {
            picasso.invalidate((Uri) object);
        } else if (object instanceof File) {
            picasso.invalidate((File) object);
        } else {
            throw new IllegalArgumentException("Please input correct arg");
        }
    }

    /**
     * 设置是否指示标志
     *
     * @param indicatorsEnabled
     */
    public static void setIndicatorsEnabled(boolean indicatorsEnabled) {
        picasso.setIndicatorsEnabled(indicatorsEnabled);
    }

    /**
     * 设置是否需要打印日志
     *
     * @param loggingEnabled
     */
    public static void setLoggingEnabled(boolean loggingEnabled) {
        picasso.setLoggingEnabled(loggingEnabled);
    }

    /**
     * 设置cancel的标志
     *
     * @param tag
     */
    public static void cancelTag(Object tag) {
        picasso.cancelTag(tag);
    }

    /**
     * 设置pause的标志
     *
     * @param tag
     */
    public static void pauseTag(Object tag) {
        picasso.pauseTag(tag);
    }

    /**
     * 设置Resume的标志
     *
     * @param tag
     */
    public static void resumeTag(Object tag) {
        picasso.resumeTag(tag);
    }

    /**
     * 停止使用当前Picasso
     * {@link Picasso#shutdown}
     */
    public static void shutdown() {
        picasso.shutdown();
    }

    /**
     * @Description: 方便MyPicasso设置一些参数的Bean
     * <p>主要设置加载中图片,失败图片,自定义修改图片样式</p>
     */
    public class PicassoBean {

        /**
         * 加载时的图像的ID
         **/
        private int placeholderResId = 0;

        /**
         * 加载失败的图像的ID
         **/
        private int errorResId = 0;

        /**
         * 针对一些自定义的图像改变
         **/
        private Transformation transformation = null;

        /**
         * 缓存方式,系统默认有缓存,如果不设置为系统默认
         **/
        private MemoryPolicy policy = null;

        /**
         * 如果在内存缓存中找不到相应的Bitmap,则使用此NetworkPolicy,系统默认,如不设置为默认
         **/
        private NetworkPolicy networkPolicy = null;

        /************************  链式结构,可以更好的设置参数*******************************/

        /**
         * 设置加载中的图片
         **/
        public PicassoBean placeholder(int placeholderResId) {
            this.placeholderResId = placeholderResId;
            return this;
        }

        /**
         * 设置失败时的图片
         **/
        public PicassoBean error(int errorResId) {
            this.errorResId = errorResId;
            return this;
        }

        /**
         * 设置图片转换的transformation
         *
         * @param transformation {@link Transformation}
         * @return
         */
        public PicassoBean transform(Transformation transformation) {
            this.transformation = transformation;
            return this;
        }

        /**
         * 设置缓存样式
         *
         * @param policy
         * @return
         */
        public PicassoBean memoryPolicy(MemoryPolicy policy) {
            this.policy = policy;
            return this;
        }

        /**
         * 设置在内存缓存中读取不到Bitmap对象,则继续实现的方式
         *
         * @param policy
         * @return
         */
        public PicassoBean networkPolicy(NetworkPolicy policy) {
            this.networkPolicy = policy;
            return this;
        }

    }


}

其中主要对经常使用的placeholderResId,errorResId等进行了封装,并且在其中实现了两个Transformation类,CircleTransForm类为裁剪为圆形图片,RangleTransForm为圆角矩形,可以在使用的时候直接传入相关参数设置即可。

CircleTransForm类如下:

public class CircleTransForm implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
        int width = source.getWidth();
        int height = source.getHeight();
        int min = Math.min(width, height);

        int width_min = (width - min) / 2;
        int height_min = (height - min) / 2;

        Bitmap bitmap = Bitmap.createBitmap(source, width_min, height_min, min, min);
        if (bitmap != source) {
            source.recycle();
        }
        Bitmap circleBit = Bitmap.createBitmap(min, min, source.getConfig());
        Canvas canvas = new Canvas(circleBit);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);
        float radius = min / (float) 2;
        canvas.drawCircle(radius, radius, radius, paint);
        bitmap.recycle();
        return circleBit;
    }

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

RangleTransForm类如下:

public class RangleTransForm implements Transformation {

    //设置圆角的角度
    private int rangle = 0;

    public RangleTransForm(int rangle) {
        this.rangle = rangle;
    }

    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap bitmap = Bitmap.createBitmap(source.getWidth(),source.getHeight(),source.getConfig());
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        BitmapShader shader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(shader);
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0,0,source.getWidth(),source.getHeight());
        canvas.drawRoundRect(rectF,rangle,rangle,paint);
        source.recycle();
        return bitmap;
    }

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

代码下载:http://download.csdn.net/detail/u012238268/9590159

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值