4a55374c53ebfaf20f8bc4494284e5d3942f1d05.svn-base 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package com.hjq.image;
  2. import android.app.Activity;
  3. import android.app.Fragment;
  4. import android.content.Context;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapShader;
  7. import android.graphics.Canvas;
  8. import android.graphics.Paint;
  9. import android.graphics.RectF;
  10. import android.graphics.drawable.Drawable;
  11. import android.support.annotation.NonNull;
  12. import android.support.v4.app.FragmentActivity;
  13. import android.widget.ImageView;
  14. import com.bumptech.glide.Glide;
  15. import com.bumptech.glide.RequestManager;
  16. import com.bumptech.glide.load.engine.DiskCacheStrategy;
  17. import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
  18. import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
  19. import com.bumptech.glide.request.RequestOptions;
  20. import com.bumptech.glide.util.Util;
  21. import java.security.MessageDigest;
  22. /**
  23. * desc : Glide 加载实现类
  24. */
  25. final class GlideHandler implements ImageHandler {
  26. private Drawable mPlaceholder;
  27. private Drawable mError;
  28. void setPlaceholder(Drawable placeholder) {
  29. mPlaceholder = placeholder;
  30. }
  31. void setError(Drawable error) {
  32. mError = error;
  33. }
  34. @Override
  35. public void loadImage(Object object, ImageView imageView, String url) {
  36. if (url != null && !"".equals(url)) {
  37. getGlide(object)
  38. .load(url.trim())
  39. .apply(RequestOptions.errorOf(mError).placeholder(mPlaceholder))
  40. .into(imageView);
  41. }
  42. }
  43. @Override
  44. public void loadImage(Object object, ImageView imageView, int resourceId) {
  45. getGlide(object)
  46. .load(resourceId)
  47. .apply(RequestOptions.errorOf(mError).placeholder(mPlaceholder))
  48. .into(imageView);
  49. }
  50. @Override
  51. public void loadCircleImage(Object object, ImageView imageView, String url) {
  52. if (url != null && !"".equals(url)) {
  53. getGlide(object)
  54. .load(url.trim())
  55. .apply(RequestOptions.errorOf(mError).placeholder(mPlaceholder).transform(new CircleTransformation()))
  56. .into(imageView);
  57. }
  58. }
  59. @Override
  60. public void loadCircleImage(Object object, ImageView imageView, int resourceId) {
  61. getGlide(object)
  62. .load(resourceId)
  63. .apply(RequestOptions.errorOf(mError).placeholder(mPlaceholder).transform(new CircleTransformation()))
  64. .into(imageView);
  65. }
  66. @Override
  67. public void loadRoundImage(Object object, ImageView imageView, String url, float radius) {
  68. if (url != null && !"".equals(url)) {
  69. getGlide(object)
  70. .load(url.trim())
  71. .apply(RequestOptions.errorOf(mError).placeholder(mPlaceholder).transform(new RadiusTransformation(radius)))
  72. .into(imageView);
  73. }
  74. }
  75. @Override
  76. public void loadRoundImage(Object object, ImageView imageView, int resourceId, float radius) {
  77. getGlide(object)
  78. .load(resourceId)
  79. .apply(RequestOptions.errorOf(mError).placeholder(mPlaceholder).transform(new RadiusTransformation(radius)))
  80. .into(imageView);
  81. }
  82. /**
  83. * 获取一个 Glide 的请求对象
  84. */
  85. private RequestManager getGlide(Object object) {
  86. if (object == null) {
  87. throw new IllegalArgumentException("You cannot start a load on a null Context");
  88. } else if (object instanceof Context) {
  89. if (object instanceof FragmentActivity) {
  90. return Glide.with((FragmentActivity) object);
  91. } else if (object instanceof Activity) {
  92. return Glide.with((Activity) object);
  93. } else {
  94. return Glide.with((Context) object);
  95. }
  96. } else if (object instanceof Fragment) {
  97. return Glide.with((Fragment) object);
  98. }else if (object instanceof android.support.v4.app.Fragment) {
  99. return Glide.with((android.support.v4.app.Fragment) object);
  100. }
  101. // 直接抛出异常
  102. throw new IllegalArgumentException("This object is illegal");
  103. }
  104. /**
  105. * 圆形图片加载:https://github.com/sunfusheng/GlideImageView/blob/master/GlideImageView/src/main/java/com/sunfusheng/transformation/CircleTransformation.java
  106. */
  107. private static final class CircleTransformation extends BitmapTransformation {
  108. private final String ID = getClass().getName();
  109. @Override
  110. protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
  111. int size = Math.min(toTransform.getWidth(), toTransform.getHeight());
  112. int x = (toTransform.getWidth() - size) / 2;
  113. int y = (toTransform.getHeight() - size) / 2;
  114. Bitmap square = Bitmap.createBitmap(toTransform, x, y, size, size);
  115. Bitmap circle = pool.get(size, size, Bitmap.Config.ARGB_8888);
  116. Canvas canvas = new Canvas(circle);
  117. Paint paint = new Paint();
  118. paint.setShader(new BitmapShader(square, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
  119. paint.setAntiAlias(true);
  120. float r = size / 2f;
  121. canvas.drawCircle(r, r, r, paint);
  122. return circle;
  123. }
  124. @Override
  125. public boolean equals(Object obj) {
  126. if (obj instanceof CircleTransformation) {
  127. return this == obj;
  128. }
  129. return false;
  130. }
  131. @Override
  132. public int hashCode() {
  133. return Util.hashCode(ID.hashCode());
  134. }
  135. @Override
  136. public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
  137. messageDigest.update(ID.getBytes(CHARSET));
  138. }
  139. }
  140. /**
  141. * 圆角图片加载:https://github.com/sunfusheng/GlideImageView/blob/master/GlideImageView/src/main/java/com/sunfusheng/transformation/RadiusTransformation.java
  142. */
  143. private static final class RadiusTransformation extends BitmapTransformation {
  144. private final String ID = getClass().getName();
  145. private float radius;
  146. RadiusTransformation(float radius) {
  147. this.radius = radius;
  148. }
  149. @Override
  150. protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
  151. int width = toTransform.getWidth();
  152. int height = toTransform.getHeight();
  153. Bitmap bitmap = pool.get(width, height, Bitmap.Config.ARGB_8888);
  154. bitmap.setHasAlpha(true);
  155. Canvas canvas = new Canvas(bitmap);
  156. Paint paint = new Paint();
  157. paint.setAntiAlias(true);
  158. paint.setShader(new BitmapShader(toTransform, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
  159. canvas.drawRoundRect(new RectF(0, 0, width, height), radius, radius, paint);
  160. return bitmap;
  161. }
  162. @Override
  163. public boolean equals(Object obj) {
  164. if (obj instanceof RadiusTransformation) {
  165. RadiusTransformation other = (RadiusTransformation) obj;
  166. return radius == other.radius;
  167. }
  168. return false;
  169. }
  170. @Override
  171. public int hashCode() {
  172. return Util.hashCode(ID.hashCode(), Util.hashCode(radius));
  173. }
  174. @Override
  175. public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
  176. messageDigest.update((ID + radius).getBytes(CHARSET));
  177. }
  178. }
  179. }