Glide入门教程――5.图片大小调整 & 缩放
在前几篇文章中,你已经学习了从各种源中加载图片,并且使用不同形式的占位图。如果你不知道图片的大小的影响,这篇文章里介绍的大小调整和缩放是相当重要的。
理想情况下,你的服务器或者API能够返回给你恰好所需分辨率的图片,这是在网络带宽、内存消耗和图片质量下的完美方案。
跟Picasso比起来,Glide在内存上占用更优化。Glide在缓存和内存里自动限制图片的大小去适配ImageView的尺寸。Picasso也有同样的能力,但需要调用fit()方法。用Glide时,如果图片不需要自动适配ImageView,调用override(horizontalSize, verticalSize),它会在将图片显示在ImageView之前调整图片的大小。
这个设置可能也是有利于没有明确目标,但已知尺寸的视图上。例如,如果app想要预先缓存在splash屏幕上,还没法测量出ImageVIews具体宽高。但,如果你已经知道图片应当为多大,使用override可以提供一个指定的大小的图片。
现在,对于任何图像的任何处理,调整图像的大小可能会扭曲长宽比,丑化图片的显示。在大多数情况下,你希望防止这种事情发升。Glide提供了变换去处理图片显示,通过设置centerCrop 和 fitCenter,可以得到两个不同的效果。
CenterCrop()会缩放图片让图片充满整个ImageView的边框,然后裁掉超出的部分。ImageVIew会被完全填充满,但是图片可能不能完全显示出。
fitCenter()会缩放图片让两边都相等或小于ImageView的所需求的边框。图片会被完整显示,可能不能完全填充整个ImageView。
我们会在随后的文章中介绍除了centerCrop() 和 fitCenter()以外的自定义变换方法。
这篇文章中,你已经学会了如何调整要显示的图片的尺寸。这对于创建出色应用非常有帮助。在我们进入更高级的Glide主题之前,我们后面将会学习一个Glide独有的功能:播放Gif和视频。
Android之 glide 框架 解读
glide图片加载框架 其目的帮助我们在开发过程中对控件上的图片加载减压,它能够通过参数和方法加载 本地图片 网络图片 二进制等到控件上 还能够设置预加载以及加载出错时的错误提示图片,还能够对加载的图片进行缓存重复利用 可以缓存原始照片还能缓存经过压缩处理后的照片,能够缓存到内存,或者硬盘,甚至glide可以加载GIF动图还可以给加载的静态图片指定大小,对于 glide的缓存机制它用的是lru 这种缓存机制 其实就是 在一定缓存空间内把最近用的以及重复用的排列在最高级 将最不常用没有重复使用的排在最低级 当有新实例出现,缓存空间不够用的情况下就会把被打有最低级标志的实例释放掉。
图片不拉伸、不改变view大小的前提下,解决空白问题
对于这个情况,第一时间想到的方法,就是imageview增加scaleType="centerCrop"。
imageview自带的centerCrop是不管图片小于还是大于imageview的大小,都会等比例拉伸填充满,然后裁剪;
另外,如果图片加载框使用的是glide,那么glide自己也有一个centerCrop,但是跟imageview自带的不一样。
Glide的centerCrop对于大图是裁剪,如果图片小于imageview,则是等比例全部显示在imageview里而不是填满裁剪;
注意:
如果imageview自己设置了centeCrop,这时候Glide再设置圆角,如果图片原图小于imageview,圆角是无效的。
这是因为glide先处理了图片数据,同时由于图片是小于imageview的大小的,所以glide的处理是全部显示在imageview上,然后处理圆角。最后把处理完的图片数据(有圆角),设置在imageview上,由于imageview有centerCrop属性,图片会等比例拉伸填充裁剪,导致了圆角的失效。
imageview同时设置fitXY 和adjustViewBounds 也能达到效果。
fitXY 这种图片的显示方式的效果是:根据 ImageView 设置的大小拉伸图片以填充满空间,(单独设置此属性时)图片会变形。
adjustViewBounds 是限制图片在显示时保持原图比例。(和 fitXY 显示方式合用能到达自适应的效果)
①自定义view,继承iamgeview,重写onMeasure
但是如果利用glide来加载图片,又会发现,上面的方法也是不行的,因为glide是根据imageview的大小来加载的,由于上面设置的是warp_content,所以glide无法准确根据大小来加载图片。
解决方法:
1、你已经知道图片(或其他方式提前知道)图片的比例,然后在用 Glide 请求图片时限制图片的加载大小,即设置 override(int width, int height) 。这时候加载到的图片是原图比例,显示的时候虽然有拉伸/压缩但都会保存原比例的。这种方式适用于你加载的图片大小都比较规范固定的时候。
2、当你请求的图片源大小不一定一致。那这时候就可以使用下面这种方式了。这种方式的原理是,先使用 Glide 把图片的原图请求加载过来,然后再按原图来显示图片。
这两种方法中,其实更加提倡的是第一种方式,因为这种方式不会造成任何负面的影响。但第二种方式,由于Glide加载图片时是以全分辨率加载的,当加载图片过大且图片很多时,可能造成 OOM。同时第二种方式使用在列表上复用时会造成条目错乱错位。
其实也简单,也是需要自定义view。
①自定义view,重写ondraw方法。
②获得将要显示的图片的尺寸或者比例,传入自定义view中,备用。
③onMeasure可以获得控件的大小,记录下来。
④在ondraw方法里,根据控件的大小和图片的大小,利用canvas先把图片从左上角开始填充。
⑤记录填充后的位置,如果还小于控件的大小,那就继续接着填充同样的图片bitmap,直到填满为止。