585 Stimmen

Wie man ein Bild in ImageView skaliert, um das Seitenverhältnis beizubehalten

In Android habe ich die layout_width eines ImageView auf fill_parent festgelegt (was die gesamte Breite des Telefons einnimmt).

Wenn das Bild, das ich dem ImageView gebe, größer ist als die layout_width, wird Android es skalieren, oder? Aber was ist mit der Höhe? Behält Android das Seitenverhältnis bei, wenn es das Bild skaliert?

Was ich herausgefunden habe, ist, dass oben und unten im ImageView weißer Raum entsteht, wenn Android ein Bild skaliert, das größer ist als das ImageView. Stimmt das? Wenn ja, wie kann ich diesen weißen Raum eliminieren?

873voto

Steve Haley Punkte 54674
  1. Ja, standardmäßig skaliert Android Ihr Bild auf die Größe des ImageView, wobei das Seitenverhältnis beibehalten wird. Stellen Sie jedoch sicher, dass Sie das Bild mit android:src="..." für den ImageView festlegen, anstatt mit android:background="...". src= skaliert das Bild, wobei das Seitenverhältnis beibehalten wird, während background= das Bild skaliert und verzerren kann, um es exakt an die Größe des ImageView anzupassen. (Sie können jedoch gleichzeitig einen Hintergrund und eine Quelle verwenden, was nützlich sein kann, um beispielsweise einen Rahmen um das Hauptbild anzuzeigen, indem nur ein ImageView verwendet wird.)

  2. Sie sollten auch android:adjustViewBounds verwenden, um den ImageView so anzupassen, dass er sich selbst an das skalierte Bild anpasst. Wenn Sie beispielsweise ein rechteckiges Bild in einem normalerweise quadratischen ImageView haben, wird durch adjustViewBounds=true der ImageView ebenfalls rechteckig skaliert. Dies beeinflusst dann, wie andere Ansichten um den ImageView herum angeordnet werden.

    Dann können Sie, wie Samuh geschrieben hat, die Art und Weise ändern, wie standardmäßig Bilder skaliert werden, indem Sie den Parameter android:scaleType verwenden. Übrigens, der einfachste Weg, herauszufinden, wie dies funktioniert, wäre einfach gewesen, ein wenig selbst zu experimentieren! Denken Sie daran, sich die Layouts im Emulator selbst anzusehen (oder auf einem tatsächlichen Telefon), da die Vorschau in Eclipse normalerweise falsch ist.

0 Stimmen

Danke. Aber was ist, wenn ich ein ImageView habe und das Bild mit imageView.setImageBitmap() setze?

22 Stimmen

Das ist dasselbe, nur in Code ausgeführt anstelle von XML. setImageBitmap ist dasselbe wie android:src="..." und setBackground... ist android:background="..."

0 Stimmen

@SteveHaley Ich weiß, es ist zu spät, aber könnten Sie mir bitte das Äquivalent von image.setImageDrawable im XML-Code sagen?

307voto

Gratzi Punkte 3069

Siehe android:adjustViewBounds.

Setze dies auf true, wenn du möchtest, dass das ImageView seine Grenzen anpasst, um das Seitenverhältnis seines Drawable beizubehalten.

7 Stimmen

Dies ist die richtige Lösung für das Problem. Wir hatten dies in unserem Bildansicht, wo die Höhe all diesen zusätzlichen Leerzeichen enthielt. Es sind keine "transparenten Pixel", da wir fill_parent für die Breite und wrap_content für die Höhe hatten. Wenn Sie adjustViewBounds=true nicht haben, erhalten Sie die zusätzlichen Leerzeichen. Nachdem wir das auf true gesetzt hatten, verschwand unser Problem. Danke!

3 Stimmen

Vielen Dank, das hat perfekt funktioniert und es auf src statt background festzulegen!

0 Stimmen

201voto

Kevin Parker Punkte 16483

Für alle anderen, die dieses spezielle Problem haben. Sie haben eine ImageView, die eine Breite von fill_parent und eine Höhe proportional skaliert haben möchten:

Fügen Sie diesen beiden Attributen Ihre ImageView hinzu:

android:adjustViewBounds="true"
android:scaleType="centerCrop"

Und setzen Sie die Breite der ImageView auf fill_parent und die Höhe auf wrap_content.

Wenn Sie außerdem nicht möchten, dass Ihr Bild beschnitten wird, versuchen Sie Folgendes:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

20 Stimmen

Ja, aber dein Bild wird beschnitten. Die perfekte Lösung wäre es, sich auf die Breite zu strecken, das Seitenverhältnis beizubehalten und nicht zu beschneiden. Ich habe keine Ahnung, warum das so nervig sein muss...

1 Stimmen

Ich auch nicht :( Es tut mir leid, wenn meine Lösung dir nicht geholfen hat, aber sie hat mir geholfen.

2 Stimmen

Kevin, was du gesagt hast, war genau das, wonach ich gesucht habe, wenn die Größe des Bildes kleiner ist als die des Bildschirms, wird es vergrößert und zentriert, perfekt. Danke.

58voto

Kevin Punkte 581

Wenn Sie ein ImageView möchten, das sowohl vergrößert als auch verkleinert wird und dabei das richtige Seitenverhältnis beibehält, fügen Sie dies Ihrem XML hinzu:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

Fügen Sie dies Ihrem Code hinzu:

// Wir müssen die Höhe anpassen, wenn die Breite des Bitmaps kleiner ist als die Ansichtsbreite, 
// ansonsten wird das Bild eingefasst.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

Es hat eine Weile gedauert, bis ich das zum Laufen gebracht habe, aber es scheint in den Fällen zu funktionieren, in denen das Bild kleiner als die Bildschirmbreite ist und größer als die Bildschirmbreite, ohne das Bild einzufassen.

1 Stimmen

Warum nicht einfach android:scaleType="centerCrop" verwenden?

0 Stimmen

Funktioniert einwandfrei, danke. Die Skalierung hängt von der Situation ab, zum Beispiel habe ich genau das gebraucht.

0 Stimmen

Dies ist eine etwas barbarische Methode zur Größenänderung der Ansicht. Was passiert, wenn sich die Ansichtsgrenzen ändern, nachdem Sie das Bitmap auf das ImageView gesetzt haben? Deshalb sollte dies in onMeasure() gemacht werden, was implementiert werden kann, wenn Sie eine benutzerdefinierte Unterklasse von ImageView erstellen.

17voto

Mike6679 Punkte 5189

Dies hat für mich funktioniert:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X