Ich möchte eine Form erstellen, die dem folgenden Bild entspricht:
Beachten Sie die Farbverläufe der oberen Hälfte von Farbe 1 bis Farbe 2, aber es gibt eine untere Hälfte, die Farbverläufe von Farbe 3 bis Farbe 4 aufweist. Ich weiß, wie man eine Form mit einem einzelnen Farbverlauf erstellt, bin mir aber nicht sicher, wie ich eine Form aufteilen soll zwei Hälften und machen 1 Form mit 2 verschiedenen Verläufen.
Irgendwelche Ideen?
Antworten:
Ich glaube nicht, dass Sie dies in XML tun können (zumindest nicht in Android), aber ich habe hier eine gute Lösung gefunden , die anscheinend eine große Hilfe wäre!
Grundsätzlich können Sie mit dem Int-Array mehrere Farbstopps auswählen. Das folgende Float-Array definiert, wo diese Stopps positioniert sind (von 0 bis 1). Sie können dies dann, wie angegeben, einfach als Standard-Drawable verwenden.
Bearbeiten: So können Sie dies in Ihrem Szenario verwenden. Angenommen, Sie haben eine Schaltfläche in XML wie folgt definiert:
Sie würden dann so etwas in Ihre onCreate () -Methode einfügen:
Ich kann dies im Moment nicht testen, dies ist Code aus meinem Kopf, aber im Grunde nur ersetzen oder Stopps für die Farben hinzufügen, die Sie benötigen. Grundsätzlich würden Sie in meinem Beispiel mit einem Hellgrün beginnen, kurz vor der Mitte zu Weiß verblassen (um eine Überblendung anstelle eines harten Übergangs zu erzielen), zwischen 45% und 55% von Weiß zu Mittelgrün überblenden und dann abblenden mittelgrün bis dunkelgrün von 55% bis zum Ende. Dies sieht möglicherweise nicht genau wie Ihre Form aus (im Moment habe ich keine Möglichkeit, diese Farben zu testen), aber Sie können dies ändern, um Ihr Beispiel zu replizieren.
Bearbeiten: Das
0, 0, 0, theButton.getHeight()
bezieht sich auch auf die x0-, y0-, x1- und y1-Koordinaten des Gradienten. Im Grunde genommen beginnt es bei x = 0 (linke Seite), y = 0 (oben) und erstreckt sich bis x = 0 (wir wollen einen vertikalen Gradienten, daher ist kein Winkel von links nach rechts erforderlich), y = Höhe der Taste. Der Farbverlauf verläuft also in einem Winkel von 90 Grad von der Oberseite der Schaltfläche zur Unterseite der Schaltfläche.Edit: Okay, also ich habe noch eine Idee, die funktioniert, haha. Im Moment funktioniert es in XML, sollte aber auch für Formen in Java möglich sein. Es ist ziemlich komplex und ich stelle mir vor, dass es eine Möglichkeit gibt, es in eine einzige Form zu vereinfachen, aber das habe ich jetzt:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
Okay, im Grunde habe ich in XML einen Formverlauf für den horizontalen grünen Farbverlauf erstellt, der in einem Winkel von 0 Grad von der linken grünen Farbe des oberen Bereichs zur rechten grünen Farbe festgelegt ist. Als nächstes machte ich ein Formrechteck mit einem halbtransparenten Grau. Ich bin mir ziemlich sicher, dass dies in das XML der Ebenenliste eingefügt werden könnte, wodurch diese zusätzliche Datei vermieden wird, aber ich bin mir nicht sicher, wie. Aber okay, dann kommt die Art von Hacky-Teil in die XML-Datei layer_list. Ich habe den grünen Farbverlauf als untere Ebene und dann die halbe Überlagerung als zweite Ebene eingefügt, die um 50 dp von der Oberseite versetzt ist. Natürlich möchten Sie, dass diese Zahl immer die Hälfte Ihrer Ansichtsgröße beträgt und keine festen 50 dp. Ich glaube jedoch nicht, dass Sie Prozentsätze verwenden können. Von dort aus habe ich gerade eine Textansicht in mein test.xml-Layout eingefügt und dabei die Datei layer_list.xml als Hintergrund verwendet.
Tada!
Noch eine Bearbeitung : Ich habe festgestellt, dass Sie die Formen einfach in die als Elemente zeichnbare Ebenenliste einbetten können, sodass Sie keine 3 separaten XML-Dateien mehr benötigen! Sie können das gleiche Ergebnis erzielen, indem Sie sie wie folgt kombinieren:
layer_list.xml
Auf diese Weise können Sie so viele Elemente überlagern, wie Sie möchten! Ich kann versuchen, herumzuspielen und zu sehen, ob ich mit Java ein vielseitigeres Ergebnis erzielen kann.
Ich denke, dies ist die letzte Bearbeitung ... : Okay, Sie können die Positionierung also definitiv über Java korrigieren, wie folgt:
Jedoch! Dies führt zu einem weiteren ärgerlichen Problem, da Sie die Textansicht erst nach dem Zeichnen messen können. Ich bin mir noch nicht ganz sicher, wie Sie dies erreichen können ... aber das manuelle Einfügen einer Nummer für topInset funktioniert.
Ich habe gelogen, noch eine Bearbeitung
Okay, Sie haben herausgefunden, wie Sie diese Ebene manuell aktualisieren können, um sie an die Höhe des Containers anzupassen. Eine vollständige Beschreibung finden Sie hier . Dieser Code sollte in Ihrer onCreate () -Methode enthalten sein:
Und ich bin fertig! Wütend! :) :)
quelle
Sie können Verlaufsformen in der XML mithilfe einer Ebenenliste überlagern. Stellen Sie sich eine Schaltfläche mit dem folgenden Standardstatus vor, bei der das zweite Element halbtransparent ist. Es fügt eine Art Vignettierung hinzu. (Bitte entschuldigen Sie die benutzerdefinierten Farben.)
quelle
Sie können dies nur mit XML-Formen tun - verwenden Sie einfach die Ebenenliste UND das negative Auffüllen wie folgt:
quelle
Versuchen Sie diese Methode, dann können Sie alles tun, was Sie wollen.
Es ist wie ein Stapel, also sei vorsichtig, welcher Gegenstand zuerst oder zuletzt kommt.
quelle
Haben Sie versucht, einen Farbverlauf mit einer nahezu transparenten Deckkraft für die Hervorhebung über einem anderen Bild mit einer undurchsichtigen Deckkraft für den grünen Farbverlauf zu überlagern?
quelle