AspectFill VS. AspectFit

时间:2021-01-01 06:56:11

从去年10月进入公司,到现在差不多忙碌了3个月,期间几乎所有精力和时间都花在了公司的项目上,有很多工作学习的心得一直没有总结,趁周末无事就来使这写一写。

除了刚进公司的那一个月是做一些修修补补的工作,后面的时间直接就在项目里大刀阔斧的搞改造,大概用了不到一个月的时间完成一个新的核心功能,当然是多亏了安卓版的前车之鉴,进度来的比较快,那段时间总体来说就是跟CoreGrahics 打交道,玩弄动画和affineTransform ,然后就是移植opencv的代码,很无脑的移植而已。这里唯一值得一提的是搞清楚了 AspectFill 和 AspectFit 是怎么回事。

AspectFill VS. AspectFit

  如果跟图片打过交道,这两个概念几乎是最常见的,其实也不仅限于图片,这个概念涉及到所有内容和容器的关系。通常,如果我们要把一个固定大小的内容,比如图片放到一个固定大小的容器里,但是这个容器的宽高比例和图片的不一样的时候,我们不能简单粗暴的直接把图片的宽高设置成和容器的一样,这样图片会被挤压而失真。所以就需要按比例来缩放图片,使其既保证真实的比例,又能塞进给定的容器。但是如何缩放就是个问题:

  1. 容器和图片的比例一样,这个好办,只需要按照比例缩放就行了,比如缩小3倍,newWidth = width / 3; newHeight = height /3
  2. 容器和图片比例不一样,问题来了。

假设容器宽和高分别是H, W;图片宽高分别是h, w。图片和容器比例不一样可能带来这个问题 h / H = 3; w / W = 2。因为要按比例,所以我们只能从缩小3倍和缩小2倍中选一个来缩放。

如果我们选择缩3 倍,那么新图片的高度刚好和容器契合,但是宽度本来只需缩小2倍就够了,但是我们缩了3倍,于是新图片在容器里的宽度就不能填满而出现了留白,这样的缩放方式就是AspectFit 因为他取了最大的缩放值从而保证整张图片都能完整的放进容器(这就是Fit),代价是不能充满容器。

对于AspectFill 当然就是与Fit 相反,其目的是“Fill” 即保证充满容器。所以选择两个缩放值中较小的那个,接上例,因为选择缩小2倍,所以宽度刚好契合容器,但是高度因为只缩了2倍所以导致一部分图片内容被截在了容器外面。

Conclusion

  AspectFill   用途:保证图片充满整个容器,方式:选取宽高缩放值里较小的值来缩放,代价:一部分图片内容被截断。

  AspectFit 用途:保证图片完整地装进容器,方式:选取宽高缩放值里较大的值来缩放,代价:容器无法装满,出现留白。

To Be Continued....