Android 之 Picasso使用
来源:互联网 发布:淘宝拓拨斯科技怎么样 编辑:程序博客网 时间:2024/06/08 01:27
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
- Android 之 Picasso使用
- Android之Picasso
- android Picasso使用详解
- Android框架之Picasso和Glide的使用及区别
- Android图片处理框架之Picasso学习使用
- 图片加载之Picasso使用
- Android图片下载框架Picasso 使用
- Android Picasso的简单使用
- Android Picasso的基本使用
- Android Picasso的基本使用
- android 图片加载框架 之 Picasso
- Android 技术之Picasso图片缓存
- Android 技术之Glide和Picasso
- Android开发必备之Picasso加载图片
- Android开发之图片加载工具Picasso
- picasso-高级使用之自定义缓存位置
- Android框架Picasso的使用简介
- Android中使用Picasso加载图片
- Python数据类型速记
- 数组基础知识
- 【NOIP2013提高组】火柴排队-逆序对
- MySQL 5.6 从零开始学 读后总结和感
- Hust oj 1384 Leyni, LOLI and Toasts(水题)
- Android 之 Picasso使用
- AOSP编译
- 浅谈Web自适应
- java学习之路 之 面向对象编程-数组
- Leetcode Set Matrix Zores
- Android Gradle manifestPlaceholders 的妙用
- NOI2016滚粗记
- Mybatis基础
- 读三体