Android ImageView-Größe skaliert nicht mit dem Quellbild

72

Ich habe ein paar ImageViews in einem LinearLayout. Ich muss die ImageViews verkleinern, damit sie ihre Seitenverhältnisse beibehalten, während sie vertikal in das LinearLayout passen. Horizontal müssen sie nur nebeneinander liegen.

Ich habe dafür einen vereinfachten Prüfstand erstellt, der gewichtete Layouts verschachtelt, sodass ich ein breites, aber nicht sehr großes LinearLayout für die ImageViews habe -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
    <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="5">
        <LinearLayout android:id="@+id/linearLayout3" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1">
            <ImageView android:id="@+id/imageView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
            <ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/test_image" android:scaleType="fitStart"></ImageView>
        </LinearLayout>
        <LinearLayout android:id="@+id/linearLayout4" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"></LinearLayout>
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"></LinearLayout>
</LinearLayout>

(Im Eclipse-Layout-Editor werden die Bilder vertikal abgeschnitten und überhaupt nicht skaliert - aber das ist nur eine dieser Eigenheiten, die wir lieben lernen.)

Bei Ausführung auf Hardware werden die Bilder auf die richtige Höhe skaliert, wobei das Seitenverhältnis beibehalten wird. Mein Problem ist, dass sie nicht nebeneinander liegen. Die Höhe jeder ImageView entspricht korrekt der Höhe des LinearLayout. Die Breite jeder ImageView entspricht der Breite des nicht skalierten Bildes - der tatsächlich verkleinerten Bilder, die auf der linken Seite ihrer ImageViews angezeigt werden. Aus diesem Grund bekomme ich eine große Lücke zwischen den Bildern.

Idealerweise möchte ich dies über XML verwalten. Wenn dies nicht möglich ist, ist die Verwendung einer benutzerdefinierten Ansicht möglicherweise die beste Lösung.

Ich habe versucht, eine IconView-Klasse (erweitert ImageView) zu erstellen, die onMeasure überschreibt, damit ich Bildansichten mit der erforderlichen Größe erstellen kann, indem ich die Breite abhängig von der Höhe skaliere. Die an die Funktion übergebene parentWidth und parentHeight waren jedoch die Abmessungen des Bildschirms und nicht des LinearLayout-Containers.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
  int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
  // Calculations followed by calls to setMeasuredDimension, setLayoutParams
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Meine Fragen sind also -

1) Kann ich das XML auf irgendeine Weise ändern, damit es das tut, was ich brauche?

2) Wie kann ich dafür sorgen, dass meine benutzerdefinierte Klasse die Höhe des LinearLayout erhält, damit ich die erforderliche Breite für die benutzerdefinierten Bilder berechnen kann?

Vielen Dank, wenn Sie es geschafft haben, so weit zu lesen. Noch mehr danke, wenn Sie mich in Richtung einer Lösung weisen können!

Rok
quelle
1
Vielen Dank, ich hatte ein ähnliches Problem: Ich wollte nur ein Bild oben auf einer App in voller Breite. Aus unbekannten Gründen war die Bildansicht fast doppelt so hoch wie das Bild selbst und blockierte wertvollen Platz auf dem Bildschirm. Dank des Hinzufügens android:adjustViewBounds="true"der Höhe zum Bild angepasst
Dave
@dave Es ist seltsam, dass android::adjustViewBoundsstandardmäßig nicht true festgelegt ist. Ich bin froh, dass Ihr Problem jetzt gelöst ist.
Rok

Antworten:

265

Was ist mit der Änderung Ihrer ImageViews android:layout_height="fill_parent"?

Bearbeiten - Ich habe eine Weile gebraucht , um es zu finden, aber das Betrachten der Quelle hat mir geholfen, adjustViewBounds genau zu bestimmen . Möglicherweise möchten Sie versuchen android:adjustViewBounds="true", Ihre ImageViews zu erweitern. Überraschenderweise ist dies standardmäßig false.

Matthew Willis
quelle
7
Das Ändern der layout_height in fill_parent machte keinen Unterschied, aber das Setzen von adjustViewBounds auf true hat den Trick getan! Ich bin erstaunt, dass ich so viel mit den verschiedenen Ansichten gearbeitet habe und es irgendwie geschafft habe, diesen Parameter nicht zu bemerken! Vielen Dank :)
Rok
1
Ich auch. Ich hatte angenommen, dass es standardmäßig true sein würde, bin aber irgendwie nie auf dieses Problem gestoßen.
Matthew Willis
1
Ich frage mich wirklich, warum "false" der Standardwert für diese wichtige Einstellung ist. @MatthewWillis du hast meinen Tag gemacht;) Vielen Dank.
Mario Fraiß
Es ist fast 2015 und ich wusste nichts über diesen adjustViewBounds = "wahren" Trick (Seufzer). Warum ist dies nicht standardmäßig wahr! Ich habe viel Yakshaving mit einem ImageView gemacht, das bei einigen Geräten das Layoutgewicht nicht zu berücksichtigen schien ... bis ich diese Antwort fand. Rettete meinen Tag!
Jose_GD
12

Seltsam android:layout_height="fill_parent"und android:adjustViewBounds="true"hat nicht geholfen. Das Problem, das ich hatte, war, dass das Bild angezeigt wurde, aber mit der Blockreihe oben und der schwarzen Reihe unten im Bild. Das Einstellen des "centerCrop"Skalentyps hat mir geholfen. Ich denke, der Grund dafür war, dass meine Bildgröße klein war.

user754657
quelle
6

Ich hatte ein ähnliches Problem und meine Lösung bestand darin, das android:scaleType="fitEnd"Attribut von ImageView in der XML-Layoutdatei festzulegen.

MichK
quelle
6
Dies löst mein Problem .. In der Tat android:scaleType="fitXY"+1 an Sie .. :)
Mitesh Shah
Vielen Dank für Ihren Kommentar @MiteshShah, fitXYder für mich gearbeitet hat!
ehehhh
0

Ja, meine Lösung dafür war:

android:scaleType="fitXY"
pilladooo
quelle