最近打算想把图片的加载框架Glide运用到自己的项目中,于是上网查了一下资料,学习了它的一些基本用法,并对其进行了简单的封装。
先上图看看效果:
当然,要想使用Glide来加载图片,当然少不了这个
compile 'com.github.bumptech.glide:glide:3.7.0'
Glide加载网络图片默认使用的协议是HttpUrlConnection,而现在比较流行的协议是OkHttp,所以,要想使用OkHttp,需要以下步骤:
1.添加依赖:
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
2.在AndroidManifest.xml文件中加入:
<meta-data android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule" android:value="GlideModule" />OK,经过以上步骤,就可以使用Glide了;但还想最缓存啊等做更多的控制,可以 自定义一个GlideModule,它可以继承OkHttpGlideModule。我自己定义的如下,你也可以根据自己项目实际的情况做调整。代码如下:
public class GlideModelConfig extends OkHttpGlideModule { int diskSize = 1024 * 1024 * 250;//磁盘缓存空间,如果不设置,默认是:250 * 1024 * 1024 即250MB int memorySize = (int) (Runtime.getRuntime().maxMemory()) / 4; // 取1/4最大内存作为最大缓存 @Override public void applyOptions(Context context, GlideBuilder builder) { // 定义缓存大小和位置 builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskSize)); //手机磁盘 builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "cache", diskSize)); //sd卡磁盘 // 默认内存和图片池大小 /*MemorySizeCalculator calculator = new MemorySizeCalculator(context); int defaultMemoryCacheSize = calculator.getMemoryCacheSize(); // 默认内存大小 int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); // 默认图片池大小 builder.setMemoryCache(new LruResourceCache(defaultMemoryCacheSize)); // 该两句无需设置,是默认的 builder.setBitmapPool(new LruBitmapPool(defaultBitmapPoolSize));*/ // 自定义内存和图片池大小 builder.setMemoryCache(new LruResourceCache(memorySize)); builder.setBitmapPool(new LruBitmapPool(memorySize)); // 定义图片格式 builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565); } @Override public void registerComponents(Context context, Glide glide) { } }里面每个设置的意思在代码中有注释,就不做解释了。当然,自定义完之后还需要替换之前在AndroidManifest.xml文件中设置的内容。
好了,经过上面的步骤,现在就可以愉快的玩耍Glide了。这里我写了一个工具类,是对Glide简单的封装,如有不妥之处或者建议,希望指出,互相学习啊。
/** * @Author: wangyb on 2016/8/27 14:38. * @描述 : Glide加载图片的封装,圆形、圆角,模糊等处理操作用到了jp.wasabeef:glide-transformations:2.0.1 * Glide默认使用httpurlconnection协议,可以配置为OkHttp */ public class GlideUtil { private static GlideUtil mInstance; private GlideUtil(){} public static GlideUtil getInstance() { if (mInstance == null) { synchronized (GlideUtil.class) { if (mInstance == null) { mInstance = new GlideUtil(); } } } return mInstance; } /** * 常量 */ static class Contants { public static final int BLUR_VALUE = 20; //模糊 public static final int CORNER_RADIUS = 20; //圆角 public static final float THUMB_SIZE = 0.5f; //0-1之间 10%原图的大小 } /** * 常规加载图片 * @param context * @param imageView 图片容器 * @param imgUrl 图片地址 * @param isFade 是否需要动画 */ public void loadImage(Context context, ImageView imageView, String imgUrl, boolean isFade) { if (isFade) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 //all:缓存源资源和转换后的资源 none:不作任何磁盘缓存 //source:缓存源资源 result:缓存转换后的资源 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .into(imageView); } else { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .into(imageView); } } /** * 加载缩略图 * @param context * @param imageView 图片容器 * @param imgUrl 图片地址 */ public void loadThumbnailImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .thumbnail(Contants.THUMB_SIZE) .into(imageView); } /** * 加载图片并设置为指定大小 * @param context * @param imageView * @param imgUrl * @param withSize * @param heightSize */ public void loadOverrideImage(Context context, ImageView imageView, String imgUrl, int withSize, int heightSize) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .override(withSize, heightSize) .into(imageView); } /** * 加载图片并对其进行模糊处理 * @param context * @param imageView * @param imgUrl */ public void loadBlurImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .bitmapTransform(new BlurTransformation(context, Contants.BLUR_VALUE)) .into(imageView); } /** * 加载圆图 * @param context * @param imageView * @param imgUrl */ public void loadCircleImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .bitmapTransform(new CropCircleTransformation(context)) .into(imageView); } /** * 加载模糊的圆角的图片 * @param context * @param imageView * @param imgUrl */ public void loadBlurCircleImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .bitmapTransform( new BlurTransformation(context, Contants.BLUR_VALUE), new CropCircleTransformation(context)) .into(imageView); } /** * 加载圆角图片 * @param context * @param imageView * @param imgUrl */ public void loadCornerImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .bitmapTransform( new RoundedCornersTransformation( context, Contants.CORNER_RADIUS, Contants.CORNER_RADIUS)) .into(imageView); } /** * 加载模糊的圆角图片 * @param context * @param imageView * @param imgUrl */ public void loadBlurCornerImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .error(R.mipmap.error) .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .bitmapTransform( new BlurTransformation(context, Contants.BLUR_VALUE), new RoundedCornersTransformation( context, Contants.CORNER_RADIUS, Contants.CORNER_RADIUS)) .into(imageView); } /** * 同步加载图片 * @param context * @param imgUrl * @param target */ public void loadBitmapSync(Context context, String imgUrl, SimpleTargettarget) { Glide.with(context) .load(imgUrl) .asBitmap() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .into(target); } /** * 加载gif * @param context * @param imageView * @param imgUrl */ public void loadGifImage(Context context, ImageView imageView, String imgUrl) { Glide.with(context) .load(imgUrl) .asGif() .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .error(R.mipmap.error) .into(imageView); } /** * 加载gif的缩略图 * @param context * @param imageView * @param imgUrl */ public void loadGifThumbnailImage(Context context, ImageView imageView,String imgUrl) { Glide.with(context) .load(imgUrl) .asGif() .crossFade() .priority(Priority.NORMAL) //下载的优先级 .diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略 .error(R.mipmap.error) .thumbnail(Contants.THUMB_SIZE) .into(imageView); } /** * 恢复请求,一般在停止滚动的时候 * @param context */ public void resumeRequests(Context context) { Glide.with(context).resumeRequests(); } /** * 暂停请求 正在滚动的时候 * @param context */ public void pauseRequests(Context context) { Glide.with(context).pauseRequests(); } /** * 清除磁盘缓存 * @param context */ public void clearDiskCache(final Context context) { new Thread(new Runnable() { @Override public void run() { Glide.get(context).clearDiskCache();//清理磁盘缓存 需要在子线程中执行 } }).start(); } /** * 清除内存缓存 * @param context */ public void clearMemory(Context context) { Glide.get(context).clearMemory();//清理内存缓存 可以在UI主线程中进行 } }
在这里简单说一下图片下载的优先级和图片磁盘缓存的策略。
下载优先级:
public enum Priority {
IMMEDIATE, //中等
HIGH,//最高
NORMAL,//默认
LOW, priority, //最低
}
对一些优先级比较高的,希望先加载出来的图片,可以调高它的下载优先级
磁盘缓存的策略:
all:缓存源资源和转换后的资源
none:不作任何磁盘缓存
source:缓存源资源
result:缓存转换后的资源
以上是一些基本的简单的用法,当然还有很多其他的一些高级用法,这里就不展开了,欢迎多多指正哈。
参考资料:http://www.cnblogs.com/whoislcj/p/5558168.html