Android ImageView: Breite anpassen

73

Ich lade das Bild herunter und setze es dynamisch als Bildschirmhintergrund mit Imageview. Ich habe versucht ScaleType, das Bild zu skalieren.

Wenn die Bildhöhe ist größer als die Breite dann ScaleTypes fitStart, fitEndund fitCenterdo n't Arbeit. Android verkleinert das Foto und passt es an die Höhe an, aber ich sehe zusätzliche Leerzeichen als Teil der Breite.

Ich möchte das Foto basierend auf der Breite verkleinern, damit es zur Breite passt, und es ist mir egal, ob es als Teil der Höhe einen zusätzlichen Leerraum gibt oder ob die Höhe zu lang ist, ist es in Ordnung, wenn es aus der Ansicht verschwindet (Wenn das möglich ist?).

ScaleType.XYSkalieren Sie das Foto und passen Sie alles in das ImageViewVerhältnis von Bildgröße und -gewicht ein.

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

Antworten:

193

Am Ende habe ich diesen Code verwendet:

<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"
            />

Stellen Sie sicher, dass Sie das Bild mit srcanstelle von einstellen background.

Sharj
quelle
2
Dies ist jedoch nicht proportional, sondern schneidet das Bild nur passend zu ... Wie kann ich das beheben?
Ruchir Baronia
Oh ok. Danke für die Antwort. Es ist also unmöglich, ein Bild proportional auf einen Bildschirm zu bringen?
Ruchir Baronia
Was schlagen Sie mir vor? Ich möchte ein Bild (Vollbild) in meiner App haben. Das Bild erscheint gestreckt. Gibt es eine Möglichkeit, dies zu beheben? Vielen Dank!
Ruchir Baronia
2
@ Sharj Soweit ich das beurteilen kann, ist es "fitCenter"statt "centerFit".
Jacksonkr
@ sharj.Thanks sein hepled mich
iCoders
62

android:adjustViewBounds="true" macht den Job!

ViliusK
quelle
13

Diese elegante Lösung, die Sie hier finden , wird für Sie wie ein Zauber wirken.

Grundsätzlich müssen Sie nur eine kleine Klasse erstellen, ImageViewdie die onMeasureMethode erweitert und einfach überschreibt , um die Breite und Höhe nach Ihren Wünschen anzupassen. Hier skaliert es mit:

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

Sie würden dieses Special ImageViewwie folgt verwenden:

<your.activity.package.AspectRatioImageView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_vertical"
    android:src="@drawable/test" />
Michel-F. Portzert
quelle
Ich habe eine ListView mit Bildern, die im laufenden Betrieb heruntergeladen wurden. Der Adapter gibt also mit ImageView ein Layout zurück, dessen Größe sich dynamisch ändern kann. Dies war der einzige Ansatz, der für mich funktioniert hat. Vielen Dank.
Dennis K
das ist überhaupt nicht elegant, das ist ziemlich hacky. Schau dir die akzeptierte Antwort an.
mpellegr
8

Es gibt eine einfache Methode, wenn Sie einfach die Breite des Bildschirms ausfüllen und die Höhe proportional haben möchten (und das Verhältnis des Bildes kennen). Dies können Sie in OnCreate () tun:

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);

Wobei 0,6 die Verhältnisanpassung ist (Sie können natürlich auch automatisch berechnen, wenn Sie das W & H des Bildes kennen).

PS:
Hier ist die XML-Seite:

  <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" />
Dan Harvey
quelle
5

Das funktioniert bei mir.

Eine Klasse erstellen erweitert 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);
            }
        }
    }

Verwenden Sie in XML anstelle von ImageView Folgendes

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

Ich denke, Sie können es nicht nur mit XML tun, Sie müssen Ihre Größe ändern, die Bitmap

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

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

dann

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;

}

Und das Layout

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

Wenn Sie den gesamten übergeordneten Block des Bildes anpassen möchten, wird das Bild
gestreckt

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY" 

Und wenn Sie das gesamte übergeordnete Bild mit dem ursprünglichen Bildverhältnis anpassen möchten,
wird ein Teil des Bildes ausgeschnitten

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop"
SK. Fuad
quelle