In einem Layout möchte ich das Hintergrundbild (unter Beibehaltung des Seitenverhältnisses) auf den Platz skalieren, der beim Erstellen der Seite zugewiesen wurde. Hat jemand eine Idee, wie das geht?
Ich verwende layout.setBackgroundDrawable()
und ein BitmapDrawable()
zum Einstellen gravity
zum Ausschneiden und Füllen, sehe aber keine Option zum Skalieren.
Antworten:
Um die Skalierung von Hintergrundbildern anzupassen, erstellen Sie eine Ressource wie folgt:
Dann wird es in der Ansicht zentriert, wenn es als Hintergrund verwendet wird. Es gibt auch andere Flags: http://developer.android.com/guide/topics/resources/drawable-resource.html
quelle
Ich habe nicht versucht, genau das zu tun, was Sie wollen, aber Sie können eine ImageView mit skalieren
android:scaleType="fitXY"
und sie wird so dimensioniert, dass sie in die Größe passt, die Sie der ImageView geben.
Sie können also ein FrameLayout für Ihr Layout erstellen, die ImageView darin platzieren und dann alle anderen Inhalte, die Sie im FrameLayout benötigen, mit einem transparenten Hintergrund versehen.
quelle
Es gibt eine einfache Möglichkeit, dies vom Drawable aus zu tun:
your_drawable.xml
Der einzige Nachteil ist, dass Ihr Bild nicht vollständig angezeigt wird, wenn nicht genügend Speicherplatz vorhanden ist. Es wird jedoch abgeschnitten. Ich konnte keinen Weg finden, dies direkt von einem Zeichenobjekt aus zu tun. Aber von den Tests, die ich gemacht habe, funktioniert es ziemlich gut und es schneidet nicht so viel vom Bild ab. Sie könnten mehr mit den Schwerkraftoptionen spielen.
Ein anderer Weg , wird es sein, nur ein Layout zu erstellen, in dem Sie eine verwenden
ImageView
und stellen Sie dasscaleType
anfitCenter
.quelle
error: <item> must have a 'name' attribute.
Halten Sie das Bildformat Sie verwenden müssen
android:scaleType=fitCenter
oderfitStart
usw. verwendenfitXY
nicht das ursprüngliche Seitenverhältnis des Bildes zu halten!Beachten Sie, dass dies nur für Bilder mit einem
src
Attribut funktioniert , nicht für das Hintergrundbild.quelle
Verwenden Sie das Bild als Hintergrundgröße für das Layout:
quelle
android:scaleType="centerCrop"
.Wenn Sie das Drawable einer ImageView mithilfe der
setBackgroundDrawable
Methode festlegen , wird das Bild immer skaliert. Parameter wieadjustViewBounds
oder andersScaleTypes
werden einfach ignoriert. Die einzige Lösung, um das gefundene SeitenverhältnisImageView
beizubehalten , besteht darin, die Größe nach dem Laden Ihres Zeichens zu ändern . Hier ist das Code-Snippet, das ich verwendet habe:Im obigen Code-Snippet ist bmp das Bitmap-Objekt, das angezeigt werden soll, und imageView ist das
ImageView
ObjektEin wichtiger Punkt ist die Änderung der Layoutparameter . Dies ist notwendig , da
setMaxHeight
undsetMaxWidth
nur einen Unterschied machen , wenn die Breite und Höhe definiert , um den Inhalt zu wickeln, nicht die Eltern zu füllen. Fill Eltern auf der anderen Seite ist die am Anfang gewünschte Einstellung, da sonstcontainerWidth
undcontainerHeight
beide werden Werte auf 0 Also gleich, in Ihrer Layout - Datei so etwas wie dies werden Sie für Ihre Image haben:quelle
Dies ist nicht die leistungsstärkste Lösung, aber wie jemand vorgeschlagen hat, können Sie anstelle des Hintergrunds FrameLayout oder RelativeLayout erstellen und ImageView als Pseudohintergrund verwenden - andere Elemente werden einfach darüber positioniert:
Das Problem mit ImageView besteht darin, dass nur die verfügbaren scaleTypes verfügbar sind: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.samples )
und um "das Hintergrundbild zu skalieren (sein Seitenverhältnis beizubehalten)" in einigen Fällen, wenn Sie möchten, dass ein Bild den gesamten Bildschirm ausfüllt (z. B. Hintergrundbild) und das Seitenverhältnis des Bildschirms sich von dem des Bildes unterscheidet, ist der erforderliche Skalentyp freundlich von TOP_CROP, weil:
CENTER_CROP zentriert das skalierte Bild, anstatt die Oberkante an der Oberkante der Bildansicht auszurichten, und FIT_START passt die Bildschirmhöhe an und füllt nicht die Breite. Und wie Benutzer Anke bemerkte, behält FIT_XY das Seitenverhältnis nicht bei.
Gerne hat jemand ImageView erweitert, um TOP_CROP zu unterstützen
https://stackoverflow.com/a/14815588/2075875
Jetzt wäre IMHO perfekt, wenn jemand ein benutzerdefiniertes Drawable schreiben würde, das das Bild so skaliert. Dann könnte es als Hintergrundparameter verwendet werden.
Reflog empfiehlt, Drawable vor der Verwendung vorab zu skalieren. Hier ist eine Anleitung, wie es geht: Java (Android): Wie skaliere ich ein Drawable ohne Bitmap? Obwohl dies den Nachteil hat, dass die hochskalierte Drawable / Bitmap mehr RAM benötigt, während die von ImageView verwendete Skalierung im laufenden Betrieb nicht mehr Speicher benötigt. Vorteil könnte eine geringere Prozessorlast sein.
quelle
Der folgende Code macht die Bitmap perfekt mit der gleichen Größe der Bildansicht. Holen Sie sich die Höhe und Breite des Bitmap-Bilds und berechnen Sie die neue Höhe und Breite mithilfe der Parameter der Bildansicht. Dadurch erhalten Sie das gewünschte Bild mit dem besten Seitenverhältnis.
quelle
Was Dweebo vorschlug, funktioniert. Aber meiner bescheidenen Meinung nach ist es unnötig. Ein Hintergrund zeichnbar skaliert gut für sich. Die Ansicht sollte eine feste Breite und Höhe haben, wie im folgenden Beispiel:
quelle
Eine Möglichkeit, es zu versuchen, besteht darin, das Bild in das Feld einzufügen
drawable-nodpi
Ordner und den Hintergrund eines Layouts auf die ID der zeichnbaren Ressource festzulegen.Dies funktioniert definitiv mit Skalierung, ich habe jedoch nicht mit Skalierung getestet.
quelle
Kotlin:
Wenn Sie eine Bitmap in einer Ansicht zeichnen müssen, skaliert auf FIT.
Sie können die richtigen Berechnungen durchführen, um bm die Höhe gleich dem Container festzulegen und die Breite anzupassen, falls das Verhältnis von bm Breite zu Höhe geringer ist als das Verhältnis von Containerbreite zu Höhe oder umgekehrt im umgekehrten Szenario.
Bilder:
quelle
Sie müssen dieses Zeichen vorab skalieren, bevor Sie es als Hintergrund verwenden können
quelle
Sie können eine der folgenden Optionen verwenden:
android :vity = "fill_horizontal | clip_vertical"
Oder
android :vity = "fill_vertical | clip_horizontal"
quelle