2011-01-23 11 views
29

Necesito cambiar el color de trazo de la aplicación. El usuario puede cambiar el color de fondo, así que también debo permitirle cambiar el trazo (contorno) del botón. Como ya está establecido en el dibujable (muestra a continuación) no he encontrado una manera de cambiar esto. Parece que todas las otras preguntas como esta solo dicen que use el archivo XML ... pero eso no me permite hacerlo dinámico. ¡Gracias por cualquier ayuda!Necesito cambiar el color de trazo a un color definido por el usuario. Nada que ver con el estado

Necesito cambiar el color de trazo a un color definido por el usuario. Nada que ver con el estado.

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

Respuesta

1

Tal vez se están refiriendo a Color State Lists que le permite cambiar el color en función de si se ha pulsado el botón/centrado/permitido/etc

+0

En este momento yo no explico lo suficientemente bueno. Necesito cambiar el color de trazo a un color definido por el usuario. nada que ver con el estado. –

+0

Intenta usar shapeDrawable (http://developer.android.com/reference/android/graphics/drawable/ShapeDrawable.html) donde Paint tiene Style = Stroke, StrokeWidth = , Color = f20k

0

Trate de usar StateLists (en contraposición a ColorStateList). Echar un vistazo: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

También puede crear un ShapeDrawable (o una RoundRectShape en su ejemplo) mediante programación, y luego la llamada del botón setBackgroundDrawable

+0

Lo siento, no lo he explicado suficientemente bueno.Necesito cambiar el color de trazo a un color definido por el usuario. nada que ver con el estado. –

0

que respondió a una pregunta similar en Change shape border color at runtime

Es como el misma solución propuesta por f20k pero en mi caso el dibujable era un GradientDrawable en lugar de un ShapeDrawable.

ver si funciona ...

96

1. Si tiene archivos estirable para una "vista" como esto

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

A continuación, puede cambiar
a. color del trazo:

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


b. color sólido:

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

2. Si tiene archivos estirable para una "vista" como esto

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

A continuación, puede cambiar el elemento individual atributos tomando objetos separados dibujable por sus posiciones.

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 

ahora a cambio de recorrido o de color sólido:

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

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

Visión general excelente de cómo trabajar con selectores y formas de forma programática. – Mercury

+0

Respuesta perfecta. Trabajando como un encanto. – Marlon

Cuestiones relacionadas