Android辟谣篇:ImageView宽高自适应

关于ImageView的自适应,一般是根据图片的宽高比进行等比缩放展示。下面重点讲解一下如何正确使用 ImageView的adjustViewBounds属性实现图片的自适应展示。

  • adjustViewBounds官方API:

Set this to true if you want the ImageView to adjust its bounds to preserve the aspect ratio of its drawable.
Must be a boolean value, either "true" or "false".

大致意思是:当adjustViewBounds="ture"的时候,可以通过调整 ImageView的界限来保持图片的宽高比例。

  • setAdjustViewBounds()源码:
public void setAdjustViewBounds(boolean adjustViewBounds) {
       mAdjustViewBounds = adjustViewBounds;
       if (adjustViewBounds) {
           setScaleType(ScaleType.FIT_CENTER);
       }
}

看源码我们知道setAdjustViewBounds(true)设置为true时,会把 ImageView的 scaleType属性设置为fitCenter;在使用时如果同时还在xml文件中设置了android:scaleType,则android:scaleType的优先级会高于android:adjustViewBounds,设置的android:adjustViewBounds="ture"中对 scaleType属性设置将会失效。出现这种情况,必须要在Java代码中重新设置setAdjustViewBounds(true)的时,才会生效。

1. AdjustViewBounds使用介绍
Android辟谣篇:ImageView宽高自适应_第1张图片
322x200样图

1)当ImageView的layout_widthlayout _height都为固定值时

XML布局实现:


Java代码实现:

ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = 320;
lp.height = 260;
imageView.setLayoutParams(lp);
imageView.setAdjustViewBounds(true);

展示效果:

Android辟谣篇:ImageView宽高自适应_第2张图片
效果图1

从效果图来看,当layout_widthlayout _height都为固定值
时,adjustViewBounds="ture"是不起作用的。ImageView将始终是设定值的宽高,图片按比例被直接填充到ImageView控件中。

2)当ImageView的layout_ widthlayout_ height只有一个为固定值时

XML布局实现:


Java代码实现:

ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
lp.height = LayoutParams.WRAP_CONTENT;
imageView.setLayoutParams(lp);
imageView.setAdjustViewBounds(true);

展示效果:

Android辟谣篇:ImageView宽高自适应_第3张图片
效果图2

从效果图来看,当ImageView的layout_ widthlayout_ height只有一个为固定值时,图片的 宽/高 将会与ImageView的layout_ width/layout_ height的固定值进行比较。

  • 若图片 宽/高小于 设置固定值时,此时ImageView的layout_ height/layout_ width将与图片的高/宽相同,图片将会以其高/宽来填充ImageView;
  • 若图片 宽/高大于或者等于 设置固定值时,此时ImageView将与图片拥有相同的宽高比,图片将会以自身的宽高比填充到ImageView。

3)当ImageView的layout_ widthlayout_ height都为wrap_content属性时

XML布局实现:


Java代码实现:

ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = LayoutParams.WRAP_CONTENT;
lp.height = LayoutParams.WRAP_CONTENT;
imageView.setLayoutParams(lp);
imageView.setAdjustViewBounds(true);

展示效果:

Android辟谣篇:ImageView宽高自适应_第4张图片
效果图3

从效果图来看,当ImageView的layout_ widthlayout_ height都为wrap_content时,adjustViewBounds是不起作用的。ImageView将始终与图片拥有相同的宽高比展示。

2. AdjustViewBounds辟谣时刻

看了网上的相关文章介绍,千篇一律的都是说adjustViewBounds必须要与maxWidth、MaxHeight一起使用,否则单独使用没有效果。其实通过上面的使用介绍就已经知道打脸了,为了进一步验证说明,下面我们再来看看。

XML布局实现:


Java代码实现:

ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = LayoutParams.WRAP_CONTENT;
lp.height = LayoutParams.WRAP_CONTENT;
imageView.setLayoutParams(lp);
imageView.setMaxWidth(320); 
imageView.setMaxHeight(260);
imageView.setAdjustViewBounds(true);

展示效果:

Android辟谣篇:ImageView宽高自适应_第5张图片
效果图4

从效果图来看,当ImageView的layout_ widthlayout_ height都为wrap_content不指定固定值时,adjustViewBounds是不起作用的。展示效果和效果图3一样的效果,ImageView将始终与图片拥有相同的宽高比展示。

官网在介绍adjustViewBounds时候,并没有提到要和maxWidth、MaxHeight一起使用,而是通过ImageView宽高界限来保持图片比例。在实际验证中也说明adjustViewBounds不需要和maxWidth、MaxHeight一起捆绑使用,可以根据需要辅助使用,但不是必要条件。

参考

ImageView官方文档传送门

好了,真相大白了!欢迎大家验证和指正!

你可能感兴趣的:(Android辟谣篇:ImageView宽高自适应)