2011-01-23 8 views
29

Ho bisogno di cambiare il colore del tratto dall'app. L'utente è in grado di cambiare il colore di sfondo, quindi devo anche lasciargli cambiare il contorno (contorno) del pulsante. Dato che è già impostato nel drawable (esempio sotto), non ho trovato un modo per cambiarlo. Sembra che tutte le altre domande come questa dicano di usare il file XML .... ma questo non mi permette di renderlo dinamico. Grazie per tutto l'aiuto!Ho bisogno di cambiare il colore del tratto con un colore definito dall'utente. Niente a che vedere con lo stato

Ho bisogno di cambiare il colore del tratto con un colore definito dall'utente. Niente a che fare con lo stato.

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 

    <solid android:color="#ffffffff"/>  
     <stroke 
       android:width="3dp" 
       android:color="@color/Dim_Gray" /> <<<<--- This is what I need to change 


    <padding android:left="10dp" 
      android:top="10dp" 
      android:right="10dp" 
      android:bottom="10dp" 
      /> 

    <corners android:bottomRightRadius="12dp" android:bottomLeftRadius="12dp" 
    android:topLeftRadius="12dp" android:topRightRadius="12dp"/> 

</shape> 

risposta

1

Forse si riferiscono a Color State Lists, che ti permette di cambiare il colore a seconda che il pulsante è stato premuto/concentrato/abilitati/etc

+0

dispiace non ho spiego abbastanza buono. Devo cambiare il colore del tratto con un colore definito dall'utente. niente a che fare con lo stato. –

+0

Provare a utilizzare shapeDrawable (http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html), dove la vernice si è Style = Corsa, StrokeWidth = , Colore = f20k

0

Provare a usare StateLists (al contrario di ColorStateList). Date un'occhiata: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

è anche possibile creare un ShapeDrawable (o un RoundRectShape nel tuo esempio) a livello di codice, e quindi chiamare il pulsante setBackgroundDrawable

+0

Mi dispiace non ha ancora spiegarlo abbastanza buono.Devo cambiare il colore del tratto con un colore definito dall'utente. niente a che fare con lo stato. –

0

ho risposto ad una domanda simile in Change shape border color at runtime

E 'come la stessa soluzione proposta da f20k ma nel mio caso il drawable era un GradientDrawable al posto di ShapeDrawable.

vedere se funziona ...

96

1. Se si dispone di file di drawable per una "vista" come questo

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" > 

<corners android:radius="5dp" /> 

<solid android:color="@android:color/white" /> 

<stroke 
    android:width="3px" 
    android:color="@color/blue" /> 

</shape> 

Quindi è possibile modificare
a. colore del tratto:

GradientDrawable drawable = (GradientDrawable)view.getBackground(); 
drawable.setStroke(3, Color.RED); // set stroke width and stroke color 


b. Tinta unita:

GradientDrawable drawable = (GradientDrawable)view.getBackground(); 
drawable.setColor(Color.RED); // set solid color 

2. Se si dispone di file di drawable per una "vista" come questo

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_checked="true" android:id="@+id/buttonSelected"> 
     <shape> 
      <solid android:color="@color/blue" /> 
      <stroke android:width="1px" android:color="@color/blue" /> 
     </shape> 
    </item> 
    <item android:state_checked="false" android:id="@+id/buttonNotSelected"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/white" /> 
      <stroke android:width="1px" android:color="@color/blue" /> 
     </shape> 
    </item> 
</selector> 

Quindi è possibile modificare l'individuo voce attributi prendendo oggetti disegnabili separati da lì posizioni.

StateListDrawable drawable = (StateListDrawable)view.getBackground(); 
DrawableContainerState dcs = (DrawableContainerState)drawable.getConstantState(); 
Drawable[] drawableItems = dcs.getChildren(); 
GradientDrawable gradientDrawableChecked = (GradientDrawable)drawableItems[0]; // item 1 
GradientDrawable gradientDrawableUnChecked = (GradientDrawable)drawableItems[1]; // item 2 

subito a cambiamento di ictus o di colore solido:

//solid color 
gradientDrawableChecked.setColor(Color.BLUE); 
gradientDrawableUnChecked.setColor(Color.RED); 

//stroke 
gradientDrawableChecked.setStroke(1, Color.RED); 
gradientDrawableUnChecked.setStroke(1, Color.BLUE); 
+0

Grande panoramica su come lavorare con selettori e forme in modo programmatico. – Mercury

+0

Risposta perfetta. Funzionando come un fascino. – Marlon