Wie richtet man ImageView nach unten, füllt seine Breite und Höhe und behält sein Seitenverhältnis?

9

Hintergrund

Es gibt verschiedene XML-Attribute, mit denen ImageView den Inhalt skalieren kann, sowie verschiedene Layout-Ansichten, mit denen Ansichten platziert und deren Größe festgelegt werden kann.

Allerdings kann ich in einigen Fällen nicht herausfinden, wie man eine Bildansicht skalieren kann.

Ein Beispiel dafür ist, das ImageView auf den unteren Rand (z. B. eines frameLayouts) zu stellen, seine Breite so weit wie möglich zu skalieren und dabei das Seitenverhältnis beizubehalten (ohne Zuschneiden).

Das Problem

Keine der Kombinationen, die ich gefunden habe, funktioniert, einschließlich verschiedener ScaleType-Werte, adjustViewBounds, gravity, ...

Es scheint, als ob ImageView einige wichtige ScaleType-Werte verpasst.

Was ich versucht habe

Bisher ist die einzige Lösung, die für mich funktionierte, darin, die Bildansicht nach unten zu setzen (indem die Schwerkraft auf unten und Mitte-horizontal gesetzt wird) und Code ähnlich wie folgt zu verwenden:

%Vor%

Dies funktioniert normalerweise und erfordert nicht viele Änderungen, damit es funktioniert, wenn es nicht im Vollbildmodus ist, aber ich frage mich, ob es einen einfacheren Weg gibt.

Es funktioniert möglicherweise nicht, wenn die Höhe zu groß wird. Sie sollten sie also ändern, damit die Breite kleiner ist, damit alles dem Container entspricht.

Die Frage

Gibt es eine Lösung oder eine Bibliothek, die die verschiedenen Probleme im Zusammenhang mit ImageView behebt?

EDIT: Hier ist ein Beispielbild von dem, was ich versuche, diesmal innerhalb eines vertikalen LinearLayouts, das das ImageView in der Mitte zwischen zwei anderen Ansichten begrenzt:

Wie Sie sehen können, ist bei einigen (oder allen?) Vorschaubildern das mittlere Bild nach rechts ausgerichtet, anstatt in der Mitte (horizontal) zu bleiben.

Ich möchte, dass es den gesamten verfügbaren Platz und die Skalierung einnimmt (das Seitenverhältnis wird beibehalten) und dennoch auf den Boden des Raumes ausgerichtet wird, den es hat.

Hier ist ein XML-Beispiel einer Kombination, die ich ausprobiert habe:

%Vor%

Beachten Sie, dass ich mehrere Kombinationen ausprobiert habe, aber keine davon funktioniert. Wenn Sie also etwas vorschlagen, das Sie im XML-Code ändern möchten, probieren Sie es bitte zuerst aus. Beachten Sie auch, dass das obige ein POC ist (um es leicht zu lesen).

Übrigens funktioniert die von mir vorgeschlagene Problemumgehung in einigen (oder den meisten?) Fällen, aber nicht in allen Fällen. Sie können es bemerken, indem Sie einfach Ihr Gerät drehen. Vielleicht gibt es eine Möglichkeit, es zu beheben oder von ImageView zu erweitern, um den zusätzlichen Fall bereitzustellen.

    
android developer 02.12.2013, 09:55
quelle

6 Antworten

15

Sie benötigen eine Kombination von drei Attributen:

%Vor%

Das adjustViewBounds -Attribut wird benötigt, weil ImageView sich selbst so misst, dass es mit den ursprünglichen Bemaßungen des Zeichenobjekts übereinstimmt, ohne Berücksichtigung einer Skalierung, die entsprechend dem Skalierungstyp durchgeführt wird.

    
corsair992 30.01.2015, 13:38
quelle
6

Sie können die benutzerdefinierte FitWidthAtBottomImageView verwenden, um diesen Code zu erhalten:

%Vor%

Zeichnen Sie manuell das unten ausgerichtete Bild, das Sie möchten.

    
Johnny 05.10.2015 08:31
quelle
1

Dies ist ein Proof-om-concept benutzerdefiniertes ImageView. Sie müssen fehlende Konstruktoren hinzufügen und die Matrix-Einstellung vornehmen Wann immer sich ImageViews Drawable ändert:

%Vor%

wie es kurz funktioniert:

  • Zuerst wird die Matrix durch Aufruf von Matrix.setRectToRect() mit stf == Matrix.ScaleToFit.CENTER gesetzt, das Ergebnis ist dasselbe wie ImageView.ScaleType.FIT_CENTER

  • Um das Drawable an den unteren Rand von Matrix.mapPoints() anzugleichen, wird die linke / untere Ecke des Drawable abgebildet und das Ergebnis ist ein transformierter Punkt, wie in der ImageView

  • und schließlich übersetzt Matrix.postTranslate() die Matrix auf der Y-Achse in die untere Bildansicht

pskink 30.01.2015 13:33
quelle
0

Versuchen Sie es mit android:scaleType="fitCenter"

Bearbeiten

Hm, ich habe gesehen, was du meinst, eine weitere Option ist es fitEnd auf dem Portrait xml zu haben und ein identisches xml im Layout-Land-Ordner zu erstellen (bei Bedarf erstellen) mit android:scaleType="fitCenter" , das im Querformat verwendet wird nur

    
Evripidis Drakos 29.01.2015 13:54
quelle
-1

Ich habe android: scaleType="fitXY" benutzt, aber es hat mich so oft versucht, bis das Bild in die XY des ganzen Bildschirms passt, was ich meine, es gibt einen seltsamen Fehler in scaleType und fitEnd wird funktionieren gut, aber Sie müssen es löschen und erneut schreiben, bis es am Ende eines beliebigen Bildschirms ohne Korsett passen. Bottom line scaleType hat Bugs und Bugs Sie, bis es Ihnen gibt, was Sie brauchen.

    
aljuaid86 02.12.2013 11:53
quelle
-1

Erstens, ich verstehe nicht wirklich, was Sie wirklich wollen, um das Bild nach unten auszurichten, von dem, was ich in Ihrem Layout gelesen habe. Mein Layout wird das Bild zentrieren, und Sie können die Höhe der unteren Ansicht ändern, um zu sehen, wie das Bild aussehen wird. Ändern Sie die Höhe der oberen oder unteren Ansicht. Die Bildgröße wird abhängig vom verfügbaren Platz für imageView nach oben oder unten skaliert.

%Vor%

Hoffe, das wird dein Problem beheben.

    
Senkethya Sar 03.02.2015 03:59
quelle

Tags und Links