Android实战(橘子娱乐)-首页(第五篇 Glide加载图片的简单封装)

来源:互联网 发布:mysql月租 编辑:程序博客网 时间:2024/05/03 00:04
前言:
       前一篇 Android实战(橘子娱乐)-首页(第四篇 MainRecyclerViewAdapter数据与布局的绑定)中我们学习了如何将数据和布局适配起来,但是由于要显示很多图片,所以我们用到了一个图片加载框架Glide的封装工具类ImageLoaderUtils去实现图片加载。下面我们将具体来看一下这个工具类具体是怎么实现的。

我们直接上代码:
  1. package com.andy.orange.utils;
  2. /**
  3. * Created by Andy Lau on 2017/8/14.
  4. * Description : 图片加载工具类 使用glide框架封装
  5. */
  6. import android.content.Context;
  7. import android.widget.ImageView;
  8. import com.andy.orange.R;
  9. import com.bumptech.glide.Glide;
  10. import com.bumptech.glide.load.DecodeFormat;
  11. import com.bumptech.glide.load.engine.DiskCacheStrategy;
  12. import java.io.File;
  13. public class ImageLoaderUtils {
  14. /*
  15. * thumbnail(0.5f)//设置播放比例
  16. * diskCacheStrategy(DiskCacheStrategy strategy)设置缓存策略 DiskCacheStrategy.SOURCE|DiskCacheStrategy.RESULT|DiskCacheStrategy.ALL|DiskCacheStrategy.NONE
  17. * priority(Priority priority)//设置优先级
  18. * dontAnimate()//移除所有动画
  19. * animate()//一步加载完成后执行的动画
  20. * placeholder()//设置占位图片
  21. * error()加载错误时显示的图片
  22. * allback(int resourceId)//设置model为空显示的图片,未设置显示error图片
  23. * skipMemoryCache(boolean skip)//设置是否跳过内存缓存,不保证一定不被缓存
  24. * into()设置将被加载的目标资源
  25. * asBitmap()//无论是gif还是普通图片都当做bitmap对待,动图将显示第一帧
  26. * asGif()//把资源当做gifDrawable对待,如果不是则显示error设置的图片
  27. * crossFade()//设置加载动画
  28. * transform()//图片转换
  29. * */
  30. public static void display(Context context, ImageView imageView, String url, int placeholder, int error) {
  31. if (imageView == null) {
  32. throw new IllegalArgumentException("argument error");
  33. }
  34. Glide.with(context).load(url).placeholder(placeholder)
  35. .error(error).crossFade().into(imageView);
  36. }
  37. public static void display(Context context, ImageView imageView, String url) {
  38. if (imageView == null) {
  39. throw new IllegalArgumentException("argument error");
  40. }
  41. Glide.with(context).load(url)
  42. .diskCacheStrategy(DiskCacheStrategy.ALL)
  43. .centerCrop()
  44. .placeholder(R.drawable.ic_image_loading)
  45. .error(R.drawable.ic_image_loading)
  46. .crossFade().into(imageView);
  47. }
  48. public static void display(Context context, ImageView imageView, File url) {
  49. if (imageView == null) {
  50. throw new IllegalArgumentException("argument error");
  51. }
  52. Glide.with(context).load(url)
  53. .diskCacheStrategy(DiskCacheStrategy.ALL)
  54. .centerCrop()
  55. .placeholder(R.drawable.ic_image_loading)
  56. .error(R.drawable.ic_image_loading)
  57. .crossFade().into(imageView);
  58. }
  59. public static void displaySmallPhoto(Context context, ImageView imageView, String url) {
  60. if (imageView == null) {
  61. throw new IllegalArgumentException("argument error");
  62. }
  63. Glide.with(context).load(url).asBitmap()
  64. .diskCacheStrategy(DiskCacheStrategy.ALL)
  65. .placeholder(R.drawable.ic_image_loading)
  66. .error(R.drawable.ic_image_loading)
  67. .thumbnail(0.5f)
  68. .into(imageView);
  69. }
  70. public static void displayBigPhoto(Context context, ImageView imageView, String url) {
  71. if (imageView == null) {
  72. throw new IllegalArgumentException("argument error");
  73. }
  74. Glide.with(context).load(url).asBitmap()
  75. .format(DecodeFormat.PREFER_ARGB_8888)
  76. .fitCenter()
  77. .diskCacheStrategy(DiskCacheStrategy.ALL)
  78. .placeholder(R.drawable.ic_image_loading)
  79. .error(R.drawable.ic_image_loading)
  80. .into(imageView);
  81. }
  82. public static void display(Context context, ImageView imageView, int url) {
  83. if (imageView == null) {
  84. throw new IllegalArgumentException("argument error");
  85. }
  86. Glide.with(context).load(url)
  87. .diskCacheStrategy(DiskCacheStrategy.ALL)
  88. .centerCrop()
  89. .placeholder(R.drawable.ic_image_loading)
  90. .error(R.mipmap.head_image)
  91. .crossFade()
  92. .into(imageView);
  93. }
  94. public static void displayRound(Context context, ImageView imageView, String url) {
  95. if (imageView == null) {
  96. throw new IllegalArgumentException("argument error");
  97. }
  98. Glide.with(context).load(url)
  99. .diskCacheStrategy(DiskCacheStrategy.ALL)
  100. .error(R.mipmap.head_image)
  101. .centerCrop()
  102. .transform(new GlideRoundTransformUtil(context)).into(imageView);
  103. }
  104. }
    简单说这个工具类就是通过Glide实现缓存加载并显示图片资源的不同类型,比如缩略图、大图、圆心图和原图。同时配置一些辅助的属性,比如加载时显示的图片,加载失败时显示的图片等。glide的简单配置代码注释很清楚,当然不是很深入,需要学习更多的可以去网上看看Glide的文章,这里我们提一下展示圆形图片的操作,看上面代码我们会看到如下这样的设置:
  1. .transform(new GlideRoundTransformUtil(context)).into(imageView)
对,你没猜错,这就是原图转换成圆形图的关键配置,接下来我们看一下GlideRoundTransformUtil的具体实现代码:
  1. package com.andy.orange.utils;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapShader;
  5. import android.graphics.Canvas;
  6. import android.graphics.Paint;
  7. import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
  8. import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
  9. /**
  10. * Created by Andy Lau on 2017/8/14.
  11. * description:glide转换圆形图片
  12. */
  13. public class GlideRoundTransformUtil extends BitmapTransformation {
  14. public GlideRoundTransformUtil(Context context) {
  15. super(context);
  16. }
  17. @Override
  18. protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
  19. return circleCrop(pool, toTransform);
  20. }
  21. private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
  22. if (source == null) return null;
  23. //去最小的边
  24. int size = Math.min(source.getWidth(), source.getHeight());
  25. //设置中心点
  26. int x = (source.getWidth() - size) / 2;
  27. int y = (source.getHeight() - size) / 2;
  28. // 创建最小边的正方形
  29. Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
  30. Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
  31. if (result == null) {
  32. result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
  33. }
  34. //创建画布
  35. Canvas canvas = new Canvas(result);
  36. //设置画笔
  37. Paint paint = new Paint();
  38. //CLAMP : 如果渲染器超出原始边界范围,会复制范围内边缘染色
  39. //REPEAT :横向和纵向的重复渲染器图片,平铺。
  40. //MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺
  41. paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
  42. paint.setAntiAlias(true);
  43. float r = size / 2f;
  44. canvas.drawCircle(r, r, r, paint);
  45. return result;
  46. }
  47. @Override
  48. public String getId() {
  49. return getClass().getName();
  50. }
  51. }
    分析:从代码来看就是继承了BitmapTransformation实现了他的
transform(BitmapPool pool,Bitmap toTransform,int outWidth,int outHeight)
方法,在里面实现对原图的裁切。根据原图长宽的最短边会准裁切出一个正方形,然后再根据这个正方形绘制圆并返回。
    
   这一篇文章就到这里,下一篇我们来学习一下presenter是如何连接Model层和View层并实现数据的传递的。

阅读全文
0 0