Ich habe eine Bildansicht. Ich möchte, dass seine Breite fill_parent ist. Ich möchte, dass seine Höhe unabhängig von der Breite ist. Beispielsweise:
<ImageView
android:layout_width="fill_parent"
android:layout_height="whatever the width ends up being" />
Ist so etwas in einer Layoutdatei möglich, ohne dass ich meine eigene Ansichtsklasse erstellen muss?
Vielen Dank
Antworten:
Update: 14. September 2017
Laut einem Kommentar unten ist die prozentuale Support-Bibliothek ab Android Support Library 26.0.0 veraltet. Dies ist der neue Weg, dies zu tun:
Siehe hier
Veraltet:
Laut diesem Beitrag von Android-Entwicklern müssen Sie jetzt nur noch alles, was Sie wollen, in ein PercentRelativeLayout oder ein PercentFrameLayout einbinden und dann die Verhältnisse wie folgt angeben
quelle
Vielleicht beantwortet dies Ihre Frage:
Sie können das
scaleType
Attribut für diese spezielle Situation ignorieren .quelle
Dies kann mithilfe von LayoutParams erfolgen, um die Höhe der Ansichten dynamisch festzulegen, sobald Sie die Breite der Ansichten zur Laufzeit kennen. Sie müssen einen ausführbaren Thread verwenden, um die Breite der Ansichten zur Laufzeit zu ermitteln. Andernfalls versuchen Sie, die Höhe festzulegen, bevor Sie die Breite der Ansicht kennen, da das Layout noch nicht gezeichnet wurde.
Beispiel, wie ich mein Problem gelöst habe:
Die LayoutParams müssen vom Typ der übergeordneten Ansicht sein, in der sich Ihre Ansicht befindet. Mein FrameLayout befindet sich in einem RelativeLayout in der XML-Datei.
wird aufgerufen, um zu erzwingen, dass die Ansicht in einem anderen Thread als dem UI-Thread neu gezeichnet wird
quelle
onMeasure
, wie in Regis 'Antwort gezeigt . Eine Alternative, aber nur für Ansichten, die über einen Adapter, z. B. im InnerenGridView
, gerendert werden , ist Matts Antwort .requestLayout()
nach dem Einstellen der Parameter funktioniert . warum sollte das so sein?Ich konnte David Chus Antwort nicht dazu bringen , für ein RecyclerView-Element zu arbeiten, und fand heraus, dass ich das ImageView auf das übergeordnete Element beschränken musste. Stellen Sie die ImageView-Breite auf ein
0dp
und beschränken Sie den Anfang und das Ende auf das übergeordnete Element . Ich bin nicht sicher, ob die Breite auf eingestellt istwrap_content
odermatch_parent
in einigen Fällen funktioniert, aber ich denke, dies ist eine bessere Möglichkeit, das untergeordnete Element eines ConstraintLayout dazu zu bringen, sein übergeordnetes Element zu füllen.quelle
Hier habe ich was ich getan habe, um einen ImageButton zu haben, dessen Breite immer gleich seiner Höhe ist (und dumme leere Ränder in eine Richtung vermeiden ... die ich als Fehler des SDK betrachte ...):
Ich habe eine SquareImageButton-Klasse definiert, die sich von ImageButton aus erstreckt:
Hier ist meine XML:
Klappt wunderbar !
quelle
In Android 26.0.0 ist PercentRelativeLayout veraltet .
Der beste Weg, es zu lösen, ist jetzt
ConstraintLayout
wie folgt :Hier finden Sie ein Tutorial zum Hinzufügen
ConstraintLayout
zu Ihrem Projekt.quelle
Wenn sich Ihre Bildansicht in einem Einschränkungslayout befindet, können Sie die folgenden Einschränkungen verwenden, um eine quadratische Bildansicht zu erstellen
quelle
Sie können es nicht allein mit dem Layout machen, ich habe es versucht. Am Ende habe ich eine sehr einfache Klasse geschrieben, um damit umzugehen. Sie können sie auf Github nachlesen. SquareImage.java Es ist Teil eines größeren Projekts, aber nichts, was durch ein kleines Kopieren und Einfügen nicht behoben werden kann (lizenziert unter Apache 2.0).
Im Wesentlichen müssen Sie nur die Höhe / Breite gleich der anderen Dimension einstellen (je nachdem, wie Sie sie skalieren möchten).
Hinweis: Mit dem
scaleType
Attribut können Sie es ohne benutzerdefinierte Klasse quadratisch machen , aber die Grenzen der Ansicht erstrecken sich über das sichtbare Bild hinaus. Dies macht es zu einem Problem, wenn Sie andere Ansichten in der Nähe platzieren.quelle
Um Ihre ImageView auf die Hälfte des Bildschirms einzustellen, müssen Sie Ihrem XML für die ImageView Folgendes hinzufügen:
Um dann die Höhe auf diese Breite einzustellen, müssen Sie dies im Code tun. Stellen Sie in der
getView
Methode IhresGridView
Adapters dieImageView
Höhe gleich der gemessenen Breite ein:quelle
Für Passanten, die 2017 vorbeikommen, ist der neue beste Weg, um das zu erreichen, was Sie wollen, die Verwendung von ConstraintLayout wie folgt :
Vergessen Sie nicht, allen vier Richtungen Einschränkungen hinzuzufügen, die von Ihrem Layout benötigt werden.
Erstellen Sie mit ConstraintLayout eine reaktionsschnelle Benutzeroberfläche
Darüber hinaus ist PercentRelativeLayout inzwischen veraltet (siehe Android-Dokumentation ).
quelle
So habe ich dieses Problem gelöst:
Vorschau - imageView mit einer Breite von "match_parent" und scaleType von "cropCenter"
picture - Bitmap-Objekt, das in imageView src festgelegt werden soll.
Das funktioniert ziemlich gut für mich.
quelle
= vw*ph/pw
anstelle des einfacheren tun= vw
. (Ich denke, Sie tun dies, um das Seitenverhältnis des Quellbildes beizubehalten, anstatt eine quadratische Vorschau zu erzwingen.)Ich glaube nicht, dass Sie dies in einer XML-Layoutdatei tun können, und ich glaube nicht, dass das
android:scaleType
Attribut so funktioniert, wie Sie es möchten.Der einzige Weg wäre, dies programmgesteuert zu tun. Sie können die Breite auf fill_parent setzen und entweder die Bildschirmbreite als Höhe der
View
oder dieView.getWidth()
Methode verwenden.quelle
Die ImageView-Funktion "scaleType" kann Ihnen hier weiterhelfen.
Dieser Code behält das Seitenverhältnis bei und positioniert das Bild oben:
Hier ist ein großartiger Beitrag, der die Möglichkeiten und Erscheinungsformen der Verwendung von scaleType zeigt.
ImageView scaleType-Beispiele
quelle
das hat mir gefallen -
quelle