Я хочу загрузить изображение (неизвестного размера, но который является всегда примерно квадратным), и отобразите его так, чтобы он заполнил экран горизонтально и простирался вертикально для поддержания соотношения сторон изображения на любом размере экрана. Вот мой (нерабочий) код. Это расширяет изображение горизонтально, но не вертикально, таким образом, это раздавлено...
ImageView mainImageView = new ImageView(context);
mainImageView.setImageBitmap(mainImage); //downloaded from server
mainImageView.setScaleType(ScaleType.FIT_XY);
//mainImageView.setAdjustViewBounds(true);
//with this line enabled, just scales image down
addView(mainImageView,new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Я сделал это с помощью специального представления. Установите layout_width = "fill_parent" и layout_height = "wrap_content" и укажите его на соответствующий объект для рисования:
public class Banner extends View {
private final Drawable logo;
public Banner(Context context) {
super(context);
logo = context.getResources().getDrawable(R.drawable.banner);
setBackgroundDrawable(logo);
}
public Banner(Context context, AttributeSet attrs) {
super(context, attrs);
logo = context.getResources().getDrawable(R.drawable.banner);
setBackgroundDrawable(logo);
}
public Banner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
logo = context.getResources().getDrawable(R.drawable.banner);
setBackgroundDrawable(logo);
}
@Override protected void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = width * logo.getIntrinsicHeight() / logo.getIntrinsicWidth();
setMeasuredDimension(width, height);
}
}
Вы устанавливаете ScaleType на ScaleType.FIT_XY. Согласно javadocs , это растянет изображение, чтобы уместить его на всю область, при необходимости изменив соотношение сторон. Это объяснило бы поведение, которое вы наблюдаете.
Чтобы получить желаемое поведение ... FIT_CENTER, FIT_START или FIT_END близки, но если изображение уже, чем его высота, оно не начнет заполнять ширину. Однако вы можете посмотреть, как они реализованы, и, вероятно, сможете выяснить, как настроить это для своих целей.
В итоге я сгенерировал размеры вручную, что работает отлично:
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = width * mainImage.getHeight() / mainImage.getWidth(); //mainImage is the Bitmap I'm drawing
addView(mainImageView,new LinearLayout.LayoutParams(
width, height));