Возможно, вы хотите установить android:adjustViewBounds
в true. Сохраняйте свою ширину fill_parent
и высоту wrap_content
. Возможно, вам все равно придется поиграть с вашим scaleType
, чтобы заставить его работать, как и ожидалось, хотя при таком подходе масштабирование сложнее.
Другой вариант - создать свой собственный подкласс ImageView. Следующее работает хорошо для меня, но может потребоваться некоторая модификация для вашего конкретного случая.
public class AspectRatioImageView extends ImageView {
private final boolean horizontal;
public AspectRatioImageView(Context context) {
this(context, null);
}
public AspectRatioImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AspectRatioImageView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.AspectRatioImageView, defStyle, 0);
int h = array
.getInt(R.styleable.AspectRatioImageView_fixedDimension, 0);
horizontal = (h == 0);
array.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
boolean widthExactly = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY;
boolean heightExactly = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY;
float ratio;
try {
ratio = ((float) ((BitmapDrawable) getDrawable())
.getIntrinsicWidth())
/ ((float) ((BitmapDrawable) getDrawable())
.getIntrinsicHeight());
} catch (ClassCastException e) {
ratio = MeasureSpec.getSize(widthMeasureSpec)
/ MeasureSpec.getSize(heightMeasureSpec);
}
int heightRatioSpec = MeasureSpec.makeMeasureSpec(
(int) (MeasureSpec.getSize(widthMeasureSpec) / ratio),
MeasureSpec.EXACTLY);
int widthRatioSpec = MeasureSpec.makeMeasureSpec(
(int) (MeasureSpec.getSize(heightMeasureSpec) * ratio),
MeasureSpec.EXACTLY);
if (widthExactly) {
if (heightExactly) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} else {
super.onMeasure(widthMeasureSpec, heightRatioSpec);
}
} else {
if (heightExactly) {
super.onMeasure(widthRatioSpec, heightMeasureSpec);
} else {
if (horizontal) {
super.onMeasure(widthMeasureSpec, heightRatioSpec);
} else {
super.onMeasure(widthRatioSpec, heightMeasureSpec);
}
}
}
}
}
Вам также необходимо добавить
<declare-styleable name="AspectRatioImageView">
<attr format="enum" name="fixedDimension">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
в /values/attr.xml, чтобы вы могли использовать атрибут app:fixedDimension=horizontal
, чтобы он знал, чтобы масштабировать вертикальное измерение.