Ich bearbeite, um die Frage zu vereinfachen, in der Hoffnung, dass dies zu einer genauen Antwort beiträgt.
Angenommen, ich habe die folgende oval
Form:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:angle="270"
android:color="#FFFF0000"/>
<stroke android:width="3dp"
android:color="#FFAA0055"/>
</shape>
Wie stelle ich die Farbe programmgesteuert innerhalb einer Aktivitätsklasse ein?
android
android-layout
shape
Cote Mounyo
quelle
quelle
oval
und ist der Hintergrund einer ImageView.View
Klasse erweitern und alsbase
Ansicht in einem Layout verwenden, das das Überlappen von Widgets (RelativeLayout
,FrameLayout
) ermöglicht. Innerhalb dieser erweitertenView
Klasse können Siedraw multiple images onto a canvas
. Aber bevor Sie das tun, schauen Sie sich diesen -> Link an (falls Sie es noch nicht getan haben).Antworten:
Hinweis : Die Antwort wurde aktualisiert, um das Szenario abzudecken, in dem
background
sich eine Instanz von befindetColorDrawable
. Vielen Dank an Tyler Pfaff für diesen Hinweis.Holen Sie sich das
Drawable
ausimageView
mitgetBackground()
:Überprüfen Sie gegen übliche Verdächtige:
Kompakte Version:
Beachten Sie, dass keine Nullprüfung erforderlich ist.
Sie sollten
mutate()
die Drawables jedoch verwenden, bevor Sie sie ändern, wenn sie an anderer Stelle verwendet werden. (Standardmäßig haben aus XML geladene Drawables denselben Status.)quelle
solid
Teil der Form bestimmen. Wie wäre es mit derstroke
Portion?@username
Ihren Kommentar hinzufügen , um sicherzustellen, dass eine Benachrichtigung an den Benutzer gesendet wird. Übrigens müssen Sie eine UnterklasseShapeDrawable
erstellen, um den Strichanteil festzulegen. Mehr Infos hier: Link . Sehen Sie sich den Kommentar an, in dem ein Problem mit der akzeptierten Antwort erwähnt wird.ImageView's
Hintergrund auf a gesetzt istGradientDrawable
,getBackground()
wird a nicht zurückgegebenShapeDrawable
. Verwenden Sie stattdessen dieGradientDrawable
die zurückgegeben wird:GradientDrawable gradientDrawable = (GradientDrawable)imageView.getBackground();
....gradientDrawable.setColors(new int[] { color1, color2 });
.Mach das so:
quelle
android:background
Ihre XML- Datei oder sogarsetBackground
Aktivitäten hinzugefügt, bevor Sie anrufengetBackground()
? Es sollte funktionieren, wenn Sie dies getan hätten.Eine einfachere Lösung wäre heutzutage, Ihre Form als Hintergrund zu verwenden und dann ihre Farbe programmgesteuert zu ändern über:
Die verfügbaren Optionen finden Sie unter PorterDuff.Mode .
UPDATE (API 29):
Die obige Methode ist seit API 29 veraltet und wird durch Folgendes ersetzt:
Die verfügbaren Optionen finden Sie unter BlendMode .
quelle
view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_ATOP);
Da es im Hintergrund einen Rand oder abgerundete Courner geben kann.getBackground()
Anruf unterlassen . Meine imageview.src enthielt eine Form und ich verwendete:imageIndicator.setColorFilter(toggleColor, PorterDuff.Mode.SRC_ATOP);
wotoggleColor
ist nur ein int, der zuvor das Ergebnis von getColor ()PorterDuff.Mode
fürBlendModeColorFilter
wird nicht kompiliert, wie es erfordertBlendMode
. Für API 29 sollte es also so seinview.background.colorFilter = BlendModeColorFilter(Color.parseColor("#343434"), BlendMode.SRC_ATOP)
.Versuche dies:
Weitere Informationen finden Sie unter diesem Link dieses
hoffe hilf.
quelle
Ich hoffe, dies hilft jemandem mit dem gleichen Problem
quelle
gd.setStroke(width_px, Color.parseColor("#FF5722"));
Erweitern Sie die Antwort von Vikram , wenn Sie dynamische Ansichten wie Elemente der Recycler-Ansicht usw. ausmalen. Dann möchten Sie wahrscheinlich mutate () aufrufen, bevor Sie die Farbe festlegen. Wenn Sie dies nicht tun, wird bei Ansichten mit einem gemeinsamen Zeichen (dh einem Hintergrund) auch das Zeichen geändert / farbig.
quelle
if (background instanceof LayerDrawable) { background = ((LayerDrawable) background.mutate()).getDrawable(indexIfLayerDrawable); } if (background instanceof ShapeDrawable)[...]
um mit Hintergrundlayouts umzugehen, die verwendet werden<layer-list ... <item ...
.Diese Frage wurde vor einiger Zeit beantwortet, kann aber durch Umschreiben als Kotlin-Erweiterungsfunktion modernisiert werden.
quelle
Dies ist die Lösung, die für mich funktioniert ... schrieb sie auch in einer anderen Frage: Wie kann man die Formfarbe dynamisch ändern?
quelle
Für mich funktioniert nichts, aber wenn ich die Farbtonfarbe einstelle, funktioniert es bei Shape Drawable
benötigen Android 5.0 API 21
quelle
Meine Version der Kotlin- Erweiterungsfunktion basiert auf den obigen Antworten mit Compat :
quelle
Der einfache Weg, die Form mit dem Radius zu füllen, ist:
quelle
Vielleicht bin ich zu spät. Aber wenn Sie Kotlin verwenden. Es gibt so einen Weg
Genießen....
quelle
Für alle, die C # Xamarin verwenden, ist hier eine Methode, die auf Vikrams Snippet basiert:
quelle