adf1e36205d20034f712fcec27dcca843646f8ba.svn-base 7.4 KB

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