Android: Как расширить изображение на экран width при поддержании соотношения сторон?

Я хочу загрузить изображение (неизвестного размера, но который является всегда примерно квадратным), и отобразите его так, чтобы он заполнил экран горизонтально и простирался вертикально для поддержания соотношения сторон изображения на любом размере экрана. Вот мой (нерабочий) код. Это расширяет изображение горизонтально, но не вертикально, таким образом, это раздавлено...

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));
118
задан fredley 7 June 2010 в 16:05
поделиться

3 ответа

Я сделал это с помощью специального представления. Установите 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);
  }
}
132
ответ дан 24 November 2019 в 01:57
поделиться

Вы устанавливаете ScaleType на ScaleType.FIT_XY. Согласно javadocs , это растянет изображение, чтобы уместить его на всю область, при необходимости изменив соотношение сторон. Это объяснило бы поведение, которое вы наблюдаете.

Чтобы получить желаемое поведение ... FIT_CENTER, FIT_START или FIT_END близки, но если изображение уже, чем его высота, оно не начнет заполнять ширину. Однако вы можете посмотреть, как они реализованы, и, вероятно, сможете выяснить, как настроить это для своих целей.

1
ответ дан 24 November 2019 в 01:57
поделиться

В итоге я сгенерировал размеры вручную, что работает отлично:

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));
24
ответ дан 24 November 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: