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).
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.
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.
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.
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.
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
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
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.
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.
Tags und Links android imageview aspect-ratio