【Android】Glide 处理长图的显示

问题:glide 显示长图会很模糊

Log日志为:Bitmap too large to be uploaded into a texture (680x7080, max=4096x4096)

因为其它图片都要完整显示的,所以不能用.centerCrop(),那么只能考虑其它方法了。


从网上找了 glide 的相关方法,发现这个库提供了回调接口:targets。

其中 SimpleTarget 可以直接拿到bitmap:

  1. private SimpleTarget target = new SimpleTarget( width, height ) {    
  2.     @Override  
  3.     public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {  
  4.           
  5.     }  
  6. };  

其中 width、height 是指定宽高,可以自己指定,也可以用原图的宽高(两个参数都传入 Target.SIZE_ORIGINAL  即可)。

接下来我们就可以运用这个回调了:

  1. Glide.with(context)  
  2.                 .load(url)  
  3.                 .placeholder(R.drawable.default)  
  4.                 .dontAnimate()  
  5.                 .into(new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {  
  6.                     @Override  
  7.                     public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {  
  8.                           
  9.                     }  
  10.   
  11.                 });  

但是,还是会报错

问题一:

 既然返回的是 bitmap,那么就得过滤掉 Gif 或 video 这两种情况,

解决方法:

 强制限制 glide,在.load(url)后面加上.asBitmap()。

问题二(长图问题):

 因为需求要求是宽度撑满屏幕,所以这个就不去判断了,我们要判断高度,根据报错信息,max 只到4096。

解决方法:

限制 imageview 的高度最大只为4096,然后再截取居中显示。(分析:首先对 bitmap 进行高度判断,如果高度超过4096就强制设置 imageview 的高为4096,宽根据需求就设置为撑满屏幕。)

下面先放代码:

  1. Glide.with(context)  
  2.                 .load(url)  
  3.                 .asBitmap()  
  4.                 .placeholder(R.drawable.default)  
  5.                 .dontAnimate()  
  6.                 .into(new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {  
  7.                     @Override  
  8.                     public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {  
  9.                         int imageHeight = resource.getHeight();  
  10.                         if(imageHeight > 4096) {  
  11.                             imageHeight = 4096;  
  12.                             ViewGroup.LayoutParams layoutParams = imageview.getLayoutParams();  
  13.                             layoutParams.width = LayoutParams.MATCH_PARENT;  
  14.                             layoutParams.height = imageHeight;  
  15.                             imageview.setLayoutParams(layoutParams);  
  16.   
  17.                             Glide.with(context)  
  18.                             .load(url)  
  19.                             .placeholder(R.drawable.default)  
  20.                             .dontAnimate()  
  21.                             .centerCrop()  
  22.                             .into(imageview);  
  23.                         }  
  24.                         else {  
  25.                             Glide.with(context)  
  26.                             .load(url)  
  27.                             .placeholder(R.drawable.default)  
  28.                             .dontAnimate()  
  29.                             .into(imageview);  
  30.                         }  
  31.                     }  

为什么再次调用 glide,为什么不直接处理bitmap,然后给 imageview 设置bitmap??????

其实对应的功能模块还有这些需求:

 * 当 imageview 图片未加载出来时要显示一张加载中的图片。

 * 只有长图才截取居中显示,正常的图片要完整显示不能居中。

 这些分别都可以通过 glide 去直接简单实现。

(PS:如果设置了加载中的占位图,那么得加上.dontAnimate(),要不会出现奇怪的现象)

glide 的 centerCrop 会根据 imageview 的大小去截取图片(速度不慢,也不卡主线程);同时 glide 也会有一定的错误捕获处理,不用再去写try catch(避免其它情况导致的崩溃),也可以错误时显示错误占位图。


然后如果你想自己处理 bitmap 的话,那就不需要再次调用 glide,可以根据自己的需求去做对应的实现即可。

你可能感兴趣的:(【Android】Glide 处理长图的显示)