web-dev-qa-db-fra.com

Bouton Android Teintable

Est-il possible de teinter le drawableLeft dans un bouton Android? J'ai un dessin noir que je voudrais teinter de blanc. Je sais comment y parvenir avec une vue d'image (image de gauche), mais je souhaite le faire avec le bouton Android par défaut.

enter image description here

Mon code source:

<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"
        />

Est-il possible de teinter le bouton? Ou existe-t-il une méthode d'affichage personnalisée pour obtenir cet effet?

26
vigonotion

Vous pouvez réaliser la coloration du drawableleft sur un bouton avec cette méthode:

Étape 1: Créez un fichier de ressources pouvant être dessiné avec un bitmap comme élément parent, comme indiqué ci-dessous, et nommez-leasic_action_landscape.xml dans le dossier pouvant être dessiné.

<?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" />

Étape 2: Créez votre contrôle Button dans votre mise en page comme ci-dessous

<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" />

Le bouton obtient le dessin de ic_action_landscape.xml du dossier pouvant être dessiné à la place de @Android: png pouvant être dessiné ou dessiné.

Méthode 2:
Étape 1:
Vous pouvez même ajouter l’icône sous forme de barre d’action et d’icônes de tabulation avec le premier plan comme image Pouvant être importée à partir d’un emplacement personnalisé ou d’un clipart.

Étape 2:
Dans la liste déroulante Thème, sélectionnez Personnalisé.

Étape 3:
Sélectionnez ensuite la couleur #FFFFFF dans la sélection de couleur de premier plan .Method 2 Pictorial representation

Enfin, terminez l’assistant pour ajouter l’image, puis ajoutez le dessinable en tant qu’image.

Pictorial representation for answer to the question

51
Shadab K

Comme @Boris l'a suggéré, vous pouvez utiliser la bibliothèque de support.

J'ai étendu le AppCompatButton avec un projet de code . Le TintAppCompatButton devrait avoir le comportement par défaut maisTintAppCompatButtonCustom a été créé pour une démonstration de la coloration personnalisée.

Je verrai si je peux créer une communication pour l’intégrer dans la bibliothèque de support officielle.

Le code d'intérêt est:

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

Je sais qu'il y a déjà beaucoup de réponses, mais aucune d'entre elles ne m'a fait plaisir, car je ne voulais pas avoir plusieurs dessinables pour différents styles d'éléments.

Ma solution a donc été de définir le filtre de couleur dans le constructeur de la manière suivante:

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);
        }
    }

J'ai utilisé la couleur du texte parce que c'était ce dont j'avais besoin, mais il peut être remplacé par un attribut personnalisé pour être plus dynamique.

1
EdgarK

Vous pouvez utiliser Android:drawableTint="@color/yourColor" dans> 23 version Android.

0
Khemraj

Je suis peut-être en retard, mais si vous utilisez C #, vous pouvez le faire de la manière suivante:

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);

Vous aurez également besoin de:

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

J'espère que cela t'aides. C'est le moyen le plus simple que j'ai trouvé… .. Notez également que TOUT lieu dans votre application où vous utilisez cette icône, ce sera cette couleur.

0
GaryP