关于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使用介绍
322x200样图1)当ImageView的layout_width
和layout _height
都为固定值
XML布局实现:
<ImageView android:id="@+id/image"
android:layout_width="320dp"
android:layout_height="260dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:background="#ff0000"
android:src="@mipmap/test_bg"/>
Java代码实现:
ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = 320;
lp.height = 260;
imageView.setLayoutParams(lp);
imageView.setAdjustViewBounds(true);
展示效果:
从效果图来看,当layout_width
和layout _height
都为固定值
时,adjustViewBounds="ture"
是不起作用的。ImageView将始终是设定值的宽高,图片按比例被直接填充到ImageView控件中。
2)当ImageView的layout_ width
和layout_ height
只有一个为固定值。
XML布局实现:
<ImageView android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:background="#ff0000"
android:src="@mipmap/test_bg"/>
Java代码实现:
ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = LayoutParams.MATCH_PARENT;
lp.height = LayoutParams.WRAP_CONTENT;
imageView.setLayoutParams(lp);
imageView.setAdjustViewBounds(true);
展示效果:
从效果图来看,当ImageView的layout_ width
和layout_ height
只有一个为固定值时,图片的 宽/高 将会与ImageView的layout_ width/layout_ height
的固定值进行比较。
- 若图片 宽/高小于 设置固定值时,此时ImageView的
layout_ height/layout_ width
将与图片的高/宽相同,图片将会以其高/宽来填充ImageView; - 若图片 宽/高大于或者等于 设置固定值时,此时ImageView将与图片拥有相同的宽高比,图片将会以自身的宽高比填充到ImageView。
3)当ImageView的layout_ width
和layout_ height
都为wrap_content
XML布局实现:
<ImageView android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:background="#ff0000"
android:src="@mipmap/test_bg"/>
Java代码实现:
ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = LayoutParams.WRAP_CONTENT;
lp.height = LayoutParams.WRAP_CONTENT;
imageView.setLayoutParams(lp);
imageView.setAdjustViewBounds(true);
展示效果:
从效果图来看,当ImageView的layout_ width
和layout_ height
都为wrap_content
时,adjustViewBounds
是不起作用的。ImageView将始终与图片拥有相同的宽高比展示。
2. AdjustViewBounds辟谣时刻
看了网上的相关文章介绍,千篇一律的都是说adjustViewBounds
必须要与maxWidth、MaxHeight
一起使用,否则单独使用没有效果。其实通过上面的使用介绍就已经知道打脸了,为了进一步验证说明,下面我们再来看看。
XML布局实现:
<ImageView android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:maxWidth="320dp"
android:maxHeight="260dp"
android:background="#ff0000"
android:src="@mipmap/test_bg"/>
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);
展示效果:
从效果图来看,当ImageView的layout_ width
和layout_ height
都为wrap_content
而不指定固定值时,adjustViewBounds
是不起作用的。展示效果和效果图3一样的效果,ImageView将始终与图片拥有相同的宽高比展示。
官网在介绍adjustViewBounds
时候,并没有提到要和maxWidth、MaxHeight
一起使用,而是通过ImageView
宽高界限来保持图片比例。在实际验证中也说明adjustViewBounds
不需要和maxWidth、MaxHeight
一起捆绑使用,可以根据需要辅助使用,但不是必要条件。
参考
好了,真相大白了!欢迎大家验证和指正!
网友评论