├── CircleTransform.java ├── GlideUtils.java └── ReadMe.md /CircleTransform.java: -------------------------------------------------------------------------------- 1 | package com.minstone.util.Glide; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.BitmapShader; 6 | import android.graphics.Canvas; 7 | import android.graphics.Paint; 8 | 9 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 10 | import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; 11 | 12 | /** 13 | * Created by litp on 2016/8/7. 14 | */ 15 | public class CircleTransform extends BitmapTransformation { 16 | public CircleTransform(Context context) { 17 | super(context); 18 | } 19 | 20 | @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { 21 | return circleCrop(pool, toTransform); 22 | } 23 | 24 | private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { 25 | if (source == null) return null; 26 | 27 | int size = Math.min(source.getWidth(), source.getHeight()); 28 | int x = (source.getWidth() - size) / 2; 29 | int y = (source.getHeight() - size) / 2; 30 | 31 | Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); 32 | 33 | Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); 34 | if (result == null) { 35 | result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 36 | } 37 | 38 | Canvas canvas = new Canvas(result); 39 | Paint paint = new Paint(); 40 | paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); 41 | paint.setAntiAlias(true); 42 | float r = size / 2f; 43 | canvas.drawCircle(r, r, r, paint); 44 | return result; 45 | } 46 | 47 | @Override public String getId() { 48 | return getClass().getName(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /GlideUtils.java: -------------------------------------------------------------------------------- 1 | package com.tpnet.video80s.utils.Glide; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.graphics.Bitmap; 6 | import android.graphics.drawable.Drawable; 7 | import android.support.annotation.DrawableRes; 8 | import android.support.annotation.NonNull; 9 | import android.widget.ImageView; 10 | 11 | import com.bumptech.glide.BitmapRequestBuilder; 12 | import com.bumptech.glide.DrawableRequestBuilder; 13 | import com.bumptech.glide.DrawableTypeRequest; 14 | import com.bumptech.glide.GifRequestBuilder; 15 | import com.bumptech.glide.Glide; 16 | import com.bumptech.glide.load.engine.DiskCacheStrategy; 17 | import com.bumptech.glide.load.resource.drawable.GlideDrawable; 18 | import com.bumptech.glide.load.resource.gif.GifDrawable; 19 | import com.bumptech.glide.request.RequestListener; 20 | import com.bumptech.glide.request.animation.GlideAnimation; 21 | import com.bumptech.glide.request.target.SimpleTarget; 22 | import com.bumptech.glide.request.target.Target; 23 | import com.tpnet.video80s.ui.view.CircleImageView; 24 | import com.tpnet.video80s.utils.DensityUtil; 25 | 26 | import java.io.File; 27 | 28 | /** 29 | * Glide封装类 30 | * Created by litp on 2016/8/6. 31 | * Last Update on 2017.3.22 。 添加注解提醒、返回类型、优化代码 32 | */ 33 | public abstract class GlideUtils { 34 | 35 | 36 | /** 37 | * 简单图片加载回调 38 | * 39 | * @param 图片url 或资源id 或 文件 40 | * @param 返回的资源,GlideDrawable或者Bitmap或者GifDrawable,ImageView.setImageRecourse设置 41 | */ 42 | public interface ImageLoadListener { 43 | 44 | /** 45 | * 图片加载成功回调 46 | * 47 | * @param uri 图片url 或资源id 或 文件 48 | * @param view 目标载体,不传则为空 49 | * @param resource 返回的资源,GlideDrawable或者Bitmap或者GifDrawable,ImageView.setImageRecourse设置 50 | */ 51 | void onLoadingComplete(T uri, ImageView view, K resource); 52 | 53 | /** 54 | * 图片加载异常返回 55 | * 56 | * @param source 图片地址、File、资源id 57 | * @param e 异常信息 58 | */ 59 | void onLoadingError(T source, Exception e); 60 | 61 | } 62 | 63 | 64 | /** 65 | * 详细加载图片加载回调 66 | * 67 | * @param 图片url 或资源id 或 文件 68 | * @param 返回的资源 69 | */ 70 | public interface ImageLoadDetailListener { 71 | 72 | /** 73 | * 图片加载成功回调 74 | * 75 | * @param uri 图片url 或资源id 或 文件 76 | * @param view 目标载体,不传则为空 77 | * @param resource 返回的资源,GlideDrawable或者Bitmap或者GifDrawable,ImageView.setImageRecourse设置 78 | */ 79 | void onLoadingComplete(T uri, ImageView view, K resource); 80 | 81 | /** 82 | * 图片加载异常返回 83 | * 84 | * @param source 图片地址、File、资源id 85 | * @param errorDrawable 加载错误占位图 86 | * @param e 异常信息 87 | */ 88 | void onLoadingError(T source, Drawable errorDrawable, Exception e); 89 | 90 | /** 91 | * 加载开始 92 | * 93 | * @param source 图片来源 94 | * @param placeHolder 开始加载占位图 95 | */ 96 | void onLoadingStart(T source, Drawable placeHolder); 97 | 98 | } 99 | 100 | 101 | /** 102 | * 根据上下文和 url获取 Glide的DrawableTypeRequest 103 | * 104 | * @param context 上下文 105 | * @param url 图片连接 106 | * @param Context类型 107 | * @param url类型 108 | * @return 返回DrawableTypeRequst 类型 109 | */ 110 | private static DrawableTypeRequest getDrawableTypeRequest(T context, K url) { 111 | DrawableTypeRequest type = null; 112 | try { 113 | if (context instanceof android.support.v4.app.Fragment) { 114 | type = Glide.with((android.support.v4.app.Fragment) context).load(url); 115 | } else if (context instanceof android.app.Fragment) { 116 | type = Glide.with((android.app.Fragment) context).load(url); 117 | } else if (context instanceof Activity) { //包括FragmentActivity 118 | type = Glide.with((Activity) context).load(url); 119 | } else if (context instanceof Context) { 120 | type = Glide.with((Context) context).load(url); 121 | } 122 | } catch (Exception e) { 123 | e.printStackTrace(); 124 | } 125 | 126 | return type; 127 | } 128 | 129 | 130 | /** 131 | * 图片加载监听类 132 | * 133 | * @param 图片链接 的类型 134 | * @param 图片资源返回类型 135 | * @param 返回的图片url 136 | */ 137 | private static class GlideListener implements RequestListener { 138 | 139 | ImageLoadListener imageLoadListener = null; 140 | Z url; 141 | ImageView imageView = null; 142 | 143 | GlideListener(ImageLoadListener imageLoadListener, Z url, ImageView view) { 144 | this.imageLoadListener = imageLoadListener; 145 | this.url = url; 146 | this.imageView = view; 147 | } 148 | 149 | GlideListener(ImageLoadListener imageLoadListener, Z url) { 150 | this.imageLoadListener = imageLoadListener; 151 | this.url = url; 152 | } 153 | 154 | GlideListener(Z url) { 155 | this.url = url; 156 | } 157 | 158 | @Override 159 | public boolean onResourceReady(K resource, T model, Target target, boolean isFromMemoryCache, boolean isFirstResource) { 160 | if (null != imageLoadListener) { 161 | if (imageView != null) { 162 | imageLoadListener.onLoadingComplete(url, imageView, resource); 163 | } else { 164 | imageLoadListener.onLoadingComplete(url, null, resource); 165 | } 166 | } 167 | 168 | return false; 169 | } 170 | 171 | @Override 172 | public boolean onException(Exception e, T model, Target target, boolean isFirstResource) { 173 | 174 | //LogUtil.e("Glide图片加载失败:"+e + " 地址为:"+url); 175 | 176 | if (imageLoadListener != null) { 177 | imageLoadListener.onLoadingError(url, e); 178 | } 179 | return false; 180 | } 181 | } 182 | 183 | 184 | /** 185 | * 获取存储器上的图片,回调返回GlideDrawable 186 | * 187 | * @param context 上下文年 188 | * @param file 文件File 189 | * @param imageLoadListener 回调监听器 190 | */ 191 | public static DrawableRequestBuilder loadImage(T context, @NonNull File file, @NonNull ImageLoadListener imageLoadListener) { 192 | DrawableTypeRequest type = getDrawableTypeRequest(context, file); 193 | if (type != null) { 194 | return type.listener(new GlideListener(imageLoadListener, file)); 195 | } else { 196 | return null; 197 | } 198 | } 199 | 200 | /** 201 | * 获取资源中的图片,回调返回GlideDrawable 202 | * 203 | * @param context 上下文 204 | * @param resourceId 资源id 205 | * @param imageLoadListener 回调监听器 206 | */ 207 | public static DrawableRequestBuilder loadImage(T context, @DrawableRes int resourceId, @NonNull ImageLoadListener imageLoadListener) { 208 | DrawableTypeRequest type = getDrawableTypeRequest(context, resourceId); 209 | if (type != null) { 210 | return type.listener(new GlideListener(imageLoadListener, resourceId)); 211 | } else { 212 | return null; 213 | } 214 | 215 | } 216 | 217 | /** 218 | * 获取网络图片,回调返回 GlideDrawable 219 | * 220 | * @param context 上下文 221 | * @param url 图片url 222 | * @param imageLoadListener 回调监听器 223 | */ 224 | public static DrawableRequestBuilder loadImage(T context, @NonNull final String url, @NonNull ImageLoadListener imageLoadListener) { 225 | DrawableTypeRequest type = getDrawableTypeRequest(context, url); 226 | if (type != null) { 227 | return type.listener(new GlideListener(imageLoadListener, url)); 228 | } else { 229 | return null; 230 | } 231 | 232 | } 233 | 234 | /** 235 | * 加载存储器上的图片到目标载体 236 | * 237 | * @param file 文件File 238 | * @param imageView 要显示到的图片ImageView 239 | */ 240 | public static Target loadImage(@NonNull final File file, @NonNull ImageView imageView, ImageLoadListener imageLoadListener) { 241 | return getDrawableTypeRequest(imageView.getContext(), file) 242 | .diskCacheStrategy(DiskCacheStrategy.NONE)//禁用磁盘缓存 243 | .skipMemoryCache(true)//跳过内存缓存 244 | .dontAnimate() 245 | .listener(new GlideListener(imageLoadListener, file, imageView)) 246 | .into(imageView); 247 | } 248 | 249 | /** 250 | * 加载资源中的图片到目标载体 251 | * 252 | * @param resourceId 资源id 253 | * @param imageView 图片View 254 | */ 255 | public static Target loadImage(@DrawableRes int resourceId, @NonNull ImageView imageView, ImageLoadListener imageLoadListener) { 256 | return getDrawableTypeRequest(imageView.getContext(), resourceId) 257 | .listener(new GlideListener(imageLoadListener, resourceId, imageView)) 258 | .into(imageView); 259 | } 260 | 261 | 262 | /** 263 | * 加载成圆形头像到普通ImageView,有动画效果 264 | * 265 | * @param url 图片url 266 | * @param imageView 要显示到的ImageView 267 | * @param imageLoadListener 加载回调监听器 268 | * @param parms 设置占位符和加载失败图片 269 | * @return 返回Target 270 | */ 271 | public static Target loadCircleImage(@NonNull String url, @NonNull ImageView imageView, ImageLoadListener imageLoadListener, int... parms) { 272 | DrawableTypeRequest type = getDrawableTypeRequest(imageView.getContext(), url); 273 | if (parms != null && parms.length > 0) { 274 | type.placeholder(parms[0]); //占位符 275 | if (parms.length > 1) { 276 | type.error(parms[1]); //图片加载失败显示图片 277 | } 278 | } 279 | type.transform(new CircleTransform(imageView.getContext())); 280 | return type.listener(new GlideListener(imageLoadListener, url, imageView)) 281 | .into(imageView); 282 | 283 | } 284 | 285 | 286 | /** 287 | * 加载网络图片到指定Imageview,支持CircleImageView 288 | * 289 | * @param url 图片url 290 | * @param imageView 要显示的Imageview 291 | * @param imageLoadListener 图片加载回调 292 | * @param parms 第一个是error的图片 293 | */ 294 | public static Target loadImage(T context, @NonNull String url, @NonNull ImageView imageView, ImageLoadListener imageLoadListener, int... parms) { 295 | DrawableTypeRequest type = getDrawableTypeRequest(context, url); 296 | if (type != null) { 297 | type.asBitmap(); 298 | if (parms != null && parms.length > 0) { 299 | type.placeholder(parms[0]); //占位符 300 | if (parms.length > 1) { 301 | type.error(parms[1]); //图片加载失败显示图片 302 | } 303 | } 304 | 305 | //单张CircleImageView不允许动画,不然会不显示, 306 | if (imageView instanceof CircleImageView) { 307 | type.dontAnimate(); 308 | } 309 | return type 310 | .listener(new GlideListener(imageLoadListener, url, imageView)) 311 | .into(imageView); 312 | } else { 313 | return null; 314 | } 315 | 316 | } 317 | 318 | /** 319 | * 加载一帧视频,添加圆角 320 | * 321 | * @param url 图片地址 322 | * @param imageView 要加载到的ImageView 323 | */ 324 | public static Target loadImageFormVideo(@NonNull String url, @NonNull ImageView imageView) { 325 | return getDrawableTypeRequest(imageView.getContext(), url) 326 | .override(DensityUtil.dip2px(150), DensityUtil.dip2px(150)) 327 | //.placeholder(android.R.drawable.picture_frame) //占位图 328 | .dontAnimate() 329 | .into(imageView); 330 | } 331 | 332 | 333 | public static Target loadImageDetail(final T context, @NonNull final String url, @NonNull final ImageView imageView, final Drawable drawable, final ImageLoadDetailListener imageLoadListener) { 334 | DrawableTypeRequest type = getDrawableTypeRequest(context, url); 335 | if (type != null) { 336 | return type.into(new SimpleTarget() { 337 | @Override 338 | public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) { 339 | if (imageView != null && resource != null) { 340 | imageView.setImageDrawable(resource); 341 | } 342 | if (imageLoadListener != null) { 343 | imageLoadListener.onLoadingComplete(url, imageView, resource); 344 | } 345 | 346 | } 347 | 348 | @Override 349 | public void onStart() { 350 | super.onStart(); 351 | if (drawable != null && imageView != null) { 352 | imageView.setImageDrawable(drawable); 353 | } 354 | 355 | } 356 | 357 | @Override 358 | public void onLoadStarted(Drawable placeholder) { 359 | super.onLoadStarted(placeholder); 360 | if (imageLoadListener != null) { 361 | imageLoadListener.onLoadingStart(url, placeholder); 362 | } 363 | 364 | } 365 | 366 | @Override 367 | public void onLoadFailed(Exception e, Drawable errorDrawable) { 368 | super.onLoadFailed(e, errorDrawable); 369 | if (imageLoadListener != null) { 370 | imageLoadListener.onLoadingError(url, errorDrawable, e); 371 | } 372 | } 373 | }); 374 | } else { 375 | return null; 376 | } 377 | 378 | } 379 | 380 | 381 | /** 382 | * 加载bitmap,回调返回 Bitmap 383 | * 384 | * @param context 上下文 385 | * @param url 图片url 386 | * @param imageLoadListener 图片加载监听器 387 | * @param 上下文类型 388 | */ 389 | public static BitmapRequestBuilder loadImageBitmap(T context, @NonNull String url,@NonNull ImageLoadListener imageLoadListener) { 390 | DrawableTypeRequest type = getDrawableTypeRequest(context, url); 391 | if (type != null) { 392 | return type.asBitmap() 393 | .listener(new GlideListener(imageLoadListener, url)); 394 | }else{ 395 | return null; 396 | } 397 | } 398 | 399 | 400 | /** 401 | * 加载GifDrawable,回调返回 GifDrawable 402 | * 403 | * @param context 上下文 404 | * @param url 图片url 405 | * @param imageLoadListener 图片加载监听器 406 | */ 407 | public static GifRequestBuilder loadImageGif(T context, @NonNull String url,@NonNull ImageLoadListener imageLoadListener) { 408 | DrawableTypeRequest type = getDrawableTypeRequest(context, url); 409 | if (type != null) { 410 | return type.asGif() 411 | .diskCacheStrategy(DiskCacheStrategy.SOURCE) 412 | .listener(new GlideListener(imageLoadListener, url)); 413 | 414 | }else{ 415 | return null; 416 | } 417 | } 418 | 419 | 420 | /** 421 | * 加载Gif的一张图片到ImageView 422 | * 423 | * @param url 图片url 424 | * @param imageLoadListener 图片加载监听器 425 | * @param imageView 426 | * @param drawable 缩略图,可以为空 427 | */ 428 | public static Target loadImageGifSingle(@NonNull String url, @NonNull ImageView imageView, ImageLoadListener imageLoadListener, Drawable drawable) { 429 | 430 | DrawableTypeRequest type = getDrawableTypeRequest(imageView.getContext(),url); 431 | return type.asBitmap() 432 | .placeholder(drawable) 433 | .diskCacheStrategy(DiskCacheStrategy.SOURCE) 434 | .listener(new GlideListener(imageLoadListener, url)) 435 | .into(imageView); 436 | } 437 | 438 | 439 | /** 440 | * 加载gif图片到指定ImageView 441 | * 442 | * @param url 图片Url 443 | * @param imageView 图片View 444 | * @param imageLoadListener 图片加载监听器 445 | */ 446 | public static Target loadImageGif(@NonNull String url, @NonNull ImageView imageView, ImageLoadListener imageLoadListener) { 447 | DrawableTypeRequest type = getDrawableTypeRequest(imageView.getContext(),url); 448 | return type.asGif() 449 | .diskCacheStrategy(DiskCacheStrategy.SOURCE) 450 | .listener(new GlideListener(imageLoadListener, url, imageView)) 451 | .into(imageView); 452 | } 453 | 454 | 455 | /** 456 | * 释放内存 457 | * 458 | * @param context 上下文 459 | */ 460 | public static void clearMemory(Context context) { 461 | Glide.get(context).clearMemory(); 462 | } 463 | 464 | 465 | /** 466 | * 取消所有正在下载或等待下载的任务。 467 | * 468 | * @param context 上下文 469 | */ 470 | public static void cancelAllTasks(Context context) { 471 | Glide.with(context).pauseRequests(); 472 | } 473 | 474 | /** 475 | * 恢复所有任务 476 | */ 477 | public static void resumeAllTasks(Context context) { 478 | Glide.with(context).resumeRequests(); 479 | } 480 | 481 | /** 482 | * 清除磁盘缓存 483 | * 484 | * @param context 上下文 485 | */ 486 | public static void clearDiskCache(final Context context) { 487 | new Thread(new Runnable() { 488 | @Override 489 | public void run() { 490 | Glide.get(context).clearDiskCache(); 491 | } 492 | }).start(); 493 | } 494 | 495 | 496 | /** 497 | * 清除所有缓存 498 | * 499 | * @param context 上下文 500 | */ 501 | public static void cleanAll(Context context) { 502 | clearDiskCache(context); 503 | clearMemory(context); 504 | } 505 | 506 | } 507 | -------------------------------------------------------------------------------- /ReadMe.md: -------------------------------------------------------------------------------- 1 | # GlideUtils 2 | Glide图片加载库的封装类 3 | 占位符 不会覆盖CircleImageView,支持直接加载静态图、动态图到View,或者获取Bitmap,Drawable。加载普通图片可以加参数设置占位符和错误图 4 | 5 | 普通加载图片(支持CircleImageView): 6 | ``` 7 | 8 | GlideUtils.loadImage(url, imageview); 9 | 10 | //GlideUtils.loadImage(this, url, imageview, null); 11 | 12 | 13 | 14 | ``` 15 | 需要添加占位图和错误图在后面加: 16 | ``` 17 | GlideUtils.loadImage(this, url, imageview, null, R.drawable.default_article_image, R.drawable.default_article_image); 18 | 19 | ``` 20 | 21 | 加载Gif图片,带监听 22 | 23 | ```Java 24 | GlideUtils.loadImageGif(mImageUrl, mImageView, new GlideUtils.ImageLoadListener() { 25 | @Override 26 | public void onLoadingComplete(String uri, ImageView view, GifDrawable resource) { 27 | progressBar.setVisibility(View.GONE); 28 | 29 | } 30 | 31 | @Override 32 | public void onLoadingError(String source, Exception e) { 33 | LogUtil.e("im查看图片加载失败:"+e); 34 | mEntry.setIsDownload(false); 35 | progressBar.setVisibility(View.GONE); 36 | mFailLayout.setVisibility(View.VISIBLE); 37 | } 38 | }); 39 | ``` 40 | 不带监听就设置把监听属性设置我为null; 41 | 42 | 43 | 加载静态图片 44 | ```Java 45 | GlideUtils.loadImage(this, mImageUrl, mImageView, new GlideUtils.ImageLoadListener() { 46 | @Override 47 | public void onLoadingComplete(String uri, ImageView view, GlideDrawable resource) { 48 | progressBar.setVisibility(View.GONE); 49 | mEntry.setIsDownload(true); 50 | } 51 | 52 | @Override 53 | public void onLoadingError(String source, Exception e) { 54 | LogUtil.e("im查看图片加载失败:" +e + "连接:" + source); 55 | mEntry.setIsDownload(false); 56 | progressBar.setVisibility(View.GONE); 57 | mFailLayout.setVisibility(View.VISIBLE); 58 | } 59 | }); 60 | ``` 61 | 62 | 63 | **重要一点**,在多图片的界面destory之后,在onDestory回调方法调用 64 | ```Java 65 | @Override 66 | protected void onDestroy() { 67 | super.onDestroy(); 68 | GlideUtils.clearMemory(this); 69 | System.gc(); 70 | } 71 | 72 | ``` 73 | 74 | 75 | 76 | 其他等等 77 | 78 | 79 | 80 | --------------------------------------------------------------------------------