2015-06-19 19 views
17

È possibile sfumare DrawableLeft in un pulsante Android? Ho un drawable nero che vorrei colorare di bianco. So come ottenere ciò con una vista immagine (immagine a sinistra) ma voglio farlo con il pulsante Android predefinito.Tinta pulsante Android Pulsante

enter image description here

mio codice sorgente:

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

C'è un modo per colorare il pulsante? O esiste un metodo di visualizzazione personalizzato per ottenere questo effetto?

+0

quindi si desidera posizionare un'immagine a sinistra del testo nel pulsante? –

+0

@HawraaKhalil sì, esattamente. Ma dovrebbe essere colorato di bianco –

+1

Vota qui https://code.google.com/p/android/issues/detail?id=198613 se vuoi drawableTint per andare nella libreria di supporto –

risposta

38

È possibile ottenere colorando la drawableleft su un pulsante con questo metodo:

Fase 1: Creare un file di risorse disegnabile con bitmap come elemento padre come mostrato di seguito e il nome come ic_action_landscape.xml nella cartella drawable

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

Fase 2: Crea il tuo controllo Button nel layout, come di seguito

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

Il pulsante ottiene il drawable dallo ic_action_landscape.xml dalla cartella drawable invece di @android: png drawable o drawable (s).

Metodo 2:
Fase 1:
È anche possibile aggiungere l'icona come azione Bar e Tab icone con primo piano come immagine che possono essere importati da una posizione personalizzata o una clipart

Fase 2:
Sotto discesa Tema selezionare Custom

Fase 3:
quindi selezionare il colore come #FFFFFF nella selezione del colore di primo piano. Method 2 Pictorial representation

Finalmente terminare la procedura guidata per aggiungere l'immagine, quindi aggiungere il disegnabile come immagine.

Pictorial representation for answer to the question

+0

Grazie, sto usando il primo metodo ora come mi piacerebbe anche usare l'icona (nera) in altre parti dell'interfaccia utente. –

+14

Tuttavia, tieni presente che l'attributo tint è supportato solo da Lollipop. Per il supporto pre-Lollipop, ho usato il seguente codice per colorare il pulsante in modo programmabile: 'Drawable [] drawables = postButton.getCompoundDrawables(); \t \t \t Drawable wrapDrawable = DrawableCompat.wrap (drawable [0]); \t \t \t DrawableCompat.setTint (wrapDrawable, getResources(). GetColor (android.R.color.white)); ', utilizzando la libreria support-v4. – Boris

+0

Sembra che il metodo 1 funzioni solo per le icone predefinite (da Android). Se aggiungiamo una nuova icona sulle nostre risorse, non funziona sulla mia parte. Solo una nota. – vida

1

Come suggerito @Boris, è possibile utilizzare la libreria di supporto.

Ho esteso l'AppCompatButton con qualche draft code. Il TintAppCompatButton dovrebbe avere il comportamento predefinito maTintAppCompatButtonCustom è stato creato per la colorazione personalizzata.

Vedrò se riesco a sollevare un PR per ottenerlo nella libreria di supporto ufficiale.

Il codice di interesse:

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

io possa essere in ritardo su questo, ma se si sta utilizzando C#, si può fare in questo modo:

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

Avrete anche bisogno :

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

Spero che questo aiuti. È il modo più semplice che ho trovato. Nota anche che QUALSIASI posto nella tua app in cui stai usando questa icona, sarà questo colore.

0

So che ci sono già molte risposte, ma non mi hanno reso felice poiché non volevo avere diversi drawable per diversi stili di elementi.

Quindi la mia soluzione era quella di impostare il filtro di colore nel costruttore in questo modo:

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

ho usato il colore del testo perché questo era quello che mi serve, ma possono essere sostituiti con attributo personalizzato per essere più dinamico.