Просмотрщик Фото Для Андроид: По Ширине


я загружаю изображение и устанавливаю его в качестве фона экрана динамически с помощью Imageview. Я пробовал ScaleType, для масштабирования изображения.

если высота изображения больше ширины, то ScaleTypesfitStart,fitEnd и fitCenter не работают. Android масштабирует фотографию и подгоняет ее по высоте, но я вижу дополнительное пустое пространство как часть ширины.

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

ScaleType.XY масштабируйте фотографию и установите все в ImageView и не заботится о соотношении высоты изображения/вес.

<ImageView 
                android:id="@+id/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:scaleType="fitStart"
            />
6 55

6 ответов:

Я в конечном итоге с помощью этого кода:

<ImageView 
                android:id="@+id/background"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:src="@drawable/name"
            />

убедитесь, что вы установили образ с помощью src вместо background.

android:adjustViewBounds="true" делает работу!

это элегантное решение нашли здесь будет работать как шарм для вас.

в основном вам просто нужно создать небольшой класс, который расширяет ImageView и просто переопределить onMeasure метод для регулировки ширины и высоты, как вы хотите. Здесь он масштабируется по ширине с помощью:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = width * getDrawable().getIntrinsicHeight() / getDrawable().getIntrinsicWidth();
    setMeasuredDimension(width, height);
}

вы бы использовали этот специальный ImageView такой:

<your.activity.package.AspectRatioImageView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_vertical"
    android:src="@drawable/test" />

существует простой метод, если вы просто хотите заполнить ширину экрана и иметь пропорциональную высоту (и знать соотношение изображения), вы можете сделать это в OnCreate ():

setContentView(R.layout.truppview_activity);
trupImage = (ImageView) findViewById(R.id.trupImage);

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float scWidth = outMetrics.widthPixels;
trupImage.getLayoutParams().width = (int) scWidth;
trupImage.getLayoutParams().height = (int) (scWidth * 0.6f);

где 0,6-это регулировка соотношения (вы также можете автоматически вычислить, конечно, если вы знаете w & h изображения).

PS:
Вот сторона XML:

  <ImageView
        android:id="@+id/trupImage"
        android:layout_width="match_parent"
        android:background="@color/orange"
        android:layout_height="match_parent" 
        android:adjustViewBounds="true" 
        android:scaleType="fitCenter" />

это работает для меня.

создать класс расширяет ImageView

    package com.yourdomain.utils;

    import android.content.Context;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.ImageView;

    public class ResizableImageView extends ImageView {

        public ResizableImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        @Override 
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            Drawable d = getDrawable();

            if (d != null) {
                int width = MeasureSpec.getSize(widthMeasureSpec);
                int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
                setMeasuredDimension(width, height);
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    }

в xml используйте следующее вместо ImageView

    <com.yourdomain.utils.ResizableImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/test" />

Я думаю, что вы не можете сделать это только с XML, вам нужно изменить себя, растровый

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();

        try {
            ((ImageView) findViewById(R.id.background))
                    .setImageBitmap(ShrinkBitmap(width));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

затем

private Bitmap ShrinkBitmap(int width)
        throws FileNotFoundException {

    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
    bmpFactoryOptions.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.img, bmpFactoryOptions);
    int widthRatio = (int) android.util.FloatMath
            .ceil(bmpFactoryOptions.outWidth / (float) width);


    bmpFactoryOptions.inSampleSize = widthRatio;



    if (bmpFactoryOptions.inSampleSize <= 0)
        bmpFactoryOptions.inSampleSize = 0;
    bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
    bmpFactoryOptions.inJustDecodeBounds = false;
    bitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.img, bmpFactoryOptions);
    return bitmap;

}

и макет

 <ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
  />