前言
图片等比例缩放平时经常用到,网上也提供了很多种方式来解决。这里记录自己开发过程中用到的一种等比例缩放场景。
Android imageView adjustViewBounds属性设置,可以支持等比缩放,再加上动态计算图片比例调整宽高比。
1.配置ImageView 的 adjustViewBounds属性为true;
<ImageView
android:id="@+id/pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:visibility="gone" />
android:adjustViewBounds=“true” 调整ImageView的边界,使得ImageView和图片有一样的长宽比例。 如果图片与ImageView组件长宽比例不同。图片也不能完美呈现效果。
2.动态计算原始图片的宽高比,根据原始图片宽高比作为锚点,太正图片的宽高比例与原始宽高比一致。
规则:
1.当宽高比1:1时 设置宽高为140 :140
2.当图片比例小于3:1,宽度固定,高度等比例缩放;当图片比例大于3:1时。图片的宽度和高度都保持一致,并都以3:1的缩略图尺寸展示。
3.当图片比例小于1:3,宽度固定,高度等比例缩放;当图片比例大于1:3时。图片的宽度和高度都保持一致,并都以1:3的缩略图尺寸展示。
源码如下:
public void setIMG(ChatMessage chatMessage) {
// android:adjustViewBounds="true"
//必须设置MaxHeight MaxWidth 才会有效
//content://media/external/images/media/804383
String thumImg = chatMessage.thumbImg;
int with = chatMessage.imgWidth;
int height = chatMessage.imgHeight;
boolean isRefresh = chatMessage.isRefresh;
ViewGroup.LayoutParams layoutParams = pic.getLayoutParams();
int defaultWith = DpUtils.dip2px(mContext, 140);
int defaultHeith = DpUtils.dip2px(mContext, 140);
float rate = 0;
//兼容未获取到宽高值的情况
if (0 < with && 0 < height) {
rate = with / Float.valueOf(height);
}
if (rate == 1 || rate == 0) {
pic.setMaxWidth(defaultWith);
pic.setMaxHeight(defaultHeith);
layoutParams.width = defaultWith;
layoutParams.height = defaultHeith;
} else if (rate > 1) {
with = defaultWith;
pic.setMaxWidth(defaultWith);
rate = Math.min(3, rate);
pic.setMaxHeight((int) (with / rate));
layoutParams.width = defaultWith;
layoutParams.height = (int) (with / rate);
} else {
height = defaultHeith;
rate = Math.max(1 / 3.0f, rate);
pic.setMaxWidth((int) (height * rate));
pic.setMaxHeight(defaultHeith);
layoutParams.width = (int) (height * rate);
layoutParams.height = defaultHeith;
}
if (isRefresh) {
if (thumImg.startsWith("content://")) {
Glide.with(this)
.load(Uri.parse(thumImg))
.into(pic);
} else {
Glide.with(this)
.load(thumImg)
.into(pic);
}
} else {
chatMessage.isRefresh = true;
}
}
这里只要根据规则写出计算方式。根据计算出来的结果,设置setMaxWidth,setMaxHeight,以及layoutParams.width,layoutParams.height。
效果
总结:adjustViewBounds =true 设置imageView的宽高比例跟随图片比例,动态调整图片缩放比例与原始比例相等就能够缩放图片不失真。