wake-up-neo.net

Android Button Drawable-Farbton

Kann man die drawableLinks in einem Android-Button einfärben? Ich habe ein schwarzes Zeichen, das ich weiß färben möchte. Ich weiß, wie ich dies mit einer Bildansicht erreichen kann (Bild links), aber ich möchte dies mit der Standard-Android-Schaltfläche tun.

enter image description here

Mein Quellcode:

<Button Android:layout_height="wrap_content"
        Android:layout_width="0dp"
        Android:layout_weight="1"
        Android:text="@string/drawer_quizzes"
        Android:backgroundTint="@color/md_light_green_500"
        Android:stateListAnimator="@null"
        Android:textColor="#fff"
        Android:textSize="12dp"
        Android:fontFamily="sans-serif"
        Android:drawableLeft="@drawable/ic_action_landscape"
        Android:gravity="left|center_vertical"
        Android:drawablePadding="8dp"
        />

Gibt es eine Möglichkeit, den Knopf zu färben? Oder gibt es eine benutzerdefinierte Ansichtsmethode, um diesen Effekt zu erzielen?

26
vigonotion

Mit dieser Methode können Sie die Zeichenfläche auf einer Schaltfläche färben:

Schritt 1: Erstellen Sie eine gezeichnete Ressourcendatei mit Bitmap als übergeordnetes Element (siehe unten), und nennen Sie sie itas ic_action_landscape.xml unter dem zu zeichnenden Ordner

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:src="@Android:drawable/ic_btn_speak_now"
    Android:tint="@color/white" />

Schritt 2: Erstellen Sie Ihr Button-Steuerelement in Ihrem Layout wie folgt

<Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:backgroundTint="@color/md_light_green_500"
        Android:drawableLeft="@drawable/ic_action_landscape"
        Android:drawablePadding="8dp"
        Android:fontFamily="sans-serif"
        Android:gravity="left|center_vertical"
        Android:stateListAnimator="@null"
        Android:text="@string/drawer_quizzes"
        Android:textColor="#fff"
        Android:textSize="12dp" />

Die Schaltfläche erhält das Zeichen von ic_action_landscape.xml aus dem Zeichenordner anstelle von @Android: Zeichen- oder Zeichen-Png (s).

Methode 2:
Schritt 1:
Sie können das Symbol sogar als Aktionsleisten- und Registersymbole mit Vordergrund als Bild Hinzufügen, das von einem benutzerdefinierten Speicherort oder einer Clipart importiert werden kann

Schritt 2:
Wählen Sie Benutzerdefiniert aus

Schritt 3:
.__ Wählen Sie dann die Farbe in der Vordergrundfarbenauswahl als #FFFFFF .Method 2 Pictorial representation

Beenden Sie schließlich den Assistenten, um das Bild hinzuzufügen, und fügen Sie dann das Zeichenobjekt als Bild hinzu.

Pictorial representation for answer to the question

51
Shadab K

Wie von @Boris vorgeschlagen, können Sie die Support-Bibliothek verwenden.

Ich habe den AppCompatButton um einige Draft Code erweitert. Das TintAppCompatButton sollte das Standardverhalten haben, aberTintAppCompatButtonCustom wurde erstellt, um benutzerdefinierte Farbgebung zu demonstrieren.

Ich werde sehen, ob ich eine PR erhöhen kann, um dies in die offizielle Support-Bibliothek aufzunehmen.

Der Code von Interesse ist:

private void init() {
    PorterDuff.Mode tintMode = PorterDuff.Mode.SRC_IN;
    Drawable[] ds = getCompoundDrawables();
    tint(ds[LEFT], Color.RED, tintMode);
    tint(ds[TOP], Color.YELLOW, tintMode);
    tint(ds[RIGHT], Color.GREEN, tintMode);
    tint(ds[BOTTOM], Color.BLUE, tintMode);
}

private void tint(Drawable d, int color, PorterDuff.Mode tintMode) {
    TintInfo ti = new TintInfo();
    ti.mTintMode = tintMode;
    ti.mTintList = ColorStateList.valueOf(color);
    ti.mHasTintList = true;
    ti.mHasTintMode = true;

    TintManager.tintDrawable(d, ti, new int[]{0});
}
1
snodnipper

Ich weiß, dass es bereits viele Antworten gibt, aber keine davon hat mich glücklich gemacht, da ich keine unterschiedlichen Drawables für verschiedene Elementstile haben wollte.

Meine Lösung bestand also darin, den Farbfilter im Konstruktor so einzustellen:

int textColor = getTextColors().getColorForState(EMPTY_STATE_SET, Color.WHITE);
    Drawable[] drawables = getCompoundDrawablesRelative();
    for (Drawable drawable : drawables) {
        if(drawable != null) {
            drawable.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP);
        }
    }

Ich habe Textfarbe verwendet, weil dies das war, was ich brauche, aber es kann durch ein benutzerdefiniertes Attribut ersetzt werden, um dynamischer zu sein.

1
EdgarK

Sie können Android:drawableTint="@color/yourColor" in> 23 Android-Version verwenden.

0
Khemraj

Genau das konnte ich auch mit einem MaterialButton (aus der Material Support Library, die die meisten Leute wahrscheinlich schon benutzen) erreichen. MaterialButton hat ein Attribut mit dem Namen icon, das links/zentriert/rechts platziert werden kann (Standardeinstellung links). Es hat auch ein Attribut namens iconTint, das das Symbol färbt.

Gradle:

implementation "com.google.Android.material:material:1.1.0-alpha09"

Aussicht:

<com.google.Android.material.button.MaterialButton
    Android:layout_width="0dp"
    Android:layout_weight="1"
    Android:text="@string/drawer_quizzes"
    Android:backgroundTint="@color/md_light_green_500"
    Android:stateListAnimator="@null"
    Android:textColor="#fff"
    Android:textSize="12dp"
    Android:fontFamily="sans-serif"
    app:icon="@drawable/ic_action_landscape"
    app:iconTint="@color/white"
    Android:gravity="left|center_vertical"
    Android:drawablePadding="8dp"
    />
0
Matt Wolfe

Ich bin zwar spät dran, aber wenn Sie C # verwenden, können Sie es so machen:

Color iconColor = Color.Orange; // TODO: Get from settings
Mode mode = Mode.SrcAtop;

Drawable drawable = ResourcesCompat.GetDrawable(Resources, Resource.Drawable.ic_action_arrest, null);

drawable.SetColorFilter(iconColor, mode);

Sie benötigen auch:

using Android.Graphics;
using static Android.Graphics.PorterDuff;
using Android.Graphics.Drawables;

Hoffe das hilft. Es ist der einfachste Weg, den ich gefunden habe . Beachten Sie auch, dass Sie JEDER Stelle in Ihrer App, dass Sie dieses Symbol verwenden, diese Farbe hat.

0
GaryP