2011-05-09 43 views
46

Tengo un dibujable que uso como fondo para un LinearLayout. Me gustaría cambiar el color de esta forma en tiempo de ejecución. He intentado usar varios métodos ... pero ninguno funciona.Android: cambiar el color de forma en tiempo de ejecución

He seguido el enfoque descrito aquí: http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html

Pero tener el mismo problema ..., duerma accidentes .. pero el color no cambia!

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#00A6C1" /> 
    <corners android:radius="@dimen/square_corners" /> 
</shape> 

fragmento de código:

GradientDrawable drawable = (GradientDrawable) activity.getResources().getDrawable(R.drawable.blue_square_shape); 


int color = ((Application) getApplication()).getColor(); 
drawable.setColor(color); 

block.findViewById(R.id.blockSquare).setBackgroundDrawable(drawable); 

findViewById(R.id.blockSquare).postInvalidate(); 

Alguna pista? Me he pasado todo el día buscando en Google ... Y cada vez es bastante molesto ...

ACTUALIZACIÓN:

Cuando trato de hacer lo mismo a esta forma:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/shape" android:shape="rectangle"> 
    <gradient android:startColor="#1FBCCF" android:endColor="#06A4C1" 
     android:angle="270" /> 
    <corners android:topLeftRadius="@dimen/footer_corners" 
     android:topRightRadius="@dimen/footer_corners" /> 
</shape> 

El color se vuelve negro ... lo que supongo que dice que se puede cambiar ...

+0

Just a guess. El Drawable no es mutable, por lo que debes crear una copia y mutar esa. – Kaj

+0

¿Por qué entonces se vuelve negro en el segundo ejemplo? : -S – neteinstein

+0

¿En qué color lo está configurando? ¿Negro? – Kaj

Respuesta

39

Ahora estoy creando un Drawable como el precompilador ... ya que no pude cambiar el color a nada que no sea negro, incluso después de probar el hex. O como se describe a continuación.

El nuevo código:

ShapeDrawable footerBackground = new ShapeDrawable(); 

// The corners are ordered top-left, top-right, bottom-right, 
// bottom-left. For each corner, the array contains 2 values, [X_radius, 
// Y_radius] 
float[] radii = new float[8]; 
radii[0] = activity.getResources().getDimension(R.dimen.footer_corners); 
radii[1] = activity.getResources().getDimension(R.dimen.footer_corners); 

radii[2] = activity.getResources().getDimension(R.dimen.footer_corners); 
radii[3] = activity.getResources().getDimension(R.dimen.footer_corners); 

footerBackground.setShape(new RoundRectShape(radii, null, null)); 

int color = ((Application) activity.getApplication()).getColor(); 

footerBackground.getPaint().setColor(color); 

views.setBackgroundDrawable(footerBackground); 

De todos modos esto es un arreglo .. una solución para la primera pregunta es lo que realmente estoy buscando! Apreciaré cualquier ayuda, por supuesto!

+0

Me parece que estoy usando la técnica Draw Shape para generar las esquinas redondeadas es una mejor solución que usar el método de esquinas redondeadas Drawable de Gradient. Parece haber un error con Drawable de Gradiente por el cual algunas esquinas no se redondean (haciendo que el botón aparezca recortado) cuando la aplicación se inicia y la pantalla se agita una vez. funciona 100% para mí. – Zhang

+0

Gracias me salvaste el tiempo. +1 voto para ti. –

1

Esto es lo que estoy haciendo en un fondo de pantalla en vivo, donde modifico un Disponibles en tiempo de ejecución:

this.original = DrawableFactory.getDrawable(getContext().getResources(), objectName)[0]; 
originalBitmap = original.getBitmap(); 
copy = new BitmapDrawable(getContext().getResources(), original.getBitmap().copy(Bitmap.Config.ARGB_8888, true)); 
copyCanvas = new Canvas(copy.getBitmap()); 

Edición: Tipo: declaraciones

public Bitmap originalBitmap; 
public BitmapDrawable original; 
public BitmapDrawable copy; 
public Canvas copyCanvas; 

Edit 2:

probar este en ese caso:

int color = (0xFF000000 | yourParsedColor) 

asentando después de ese color.

+0

¿Qué tipo es original y copia? – neteinstein

+0

Incluso con eso ... solo se pone negro :-( – neteinstein

+0

Suspiro, necesitaría depurarlo en ese caso, pero desafortunadamente no es algo que me gustaría hacer :( – Kaj

31

ver si algo similar a esto funciona para usted:

TextView tv2 = (TextView) rl.findViewById(R.id.toggle_indicator); 
/* Refer to http://developer.android.com/reference/android/graphics/drawable/GradientDrawable.html#mutate() 
to understand why we need to mutate the GradientDrawable*/ 
GradientDrawable sd = (GradientDrawable) tv2.getBackground().mutate(); 
sd.setColor(0xff999999); 
sd.invalidateSelf(); 

En mi caso tengo un TextView que tiene una ShapeDrawable como fondo. Quería cambiar su color y logré que esto funcionara. Inexplicablemente, tv2.getBackground() devuelve un GradientDrawable en lugar de un ShapeDrawable; esto también se ha informado en otros lugares.

Editar: Sobre el color, intente establecer un valor alfa de 0xff. Si observas, incluso en mi código anterior, la función setColor() toma un valor hexadecimal adicional aparte del valor hexadecimal RGB regular. Esto es para Alpha/Opacity. Si se establece en 0x00, el Drawable tendrá un color negro, independientemente del RGB (suponiendo que el color de fondo sea negro). 0x00 es un objeto completamente transparente & 0xff es un objeto completamente opaco.

+0

@NeTeInStEiN eche un vistazo a la explicación del color negro que acabo de agregar. Si esto resuelve completamente tu problema, te pediría que elijas este como la respuesta correcta. –

+0

+1 @SaurabhNanda para resolver mi problema. Muy extraño es un Gradiente. ¡Reutilizable, no! –

+0

gracias @saurab h nanda ..resolvió mi problema –

26
GradientDrawable background = (GradientDrawable) titleTextView.getBackground(); 
background.setColor(getResources().getColor(R.color.some_color)); 

El método setColor pide correctamente un redibujado en el elemento (Si en XML que utilizó el > elemento < forma que siempre se convertirá en un GradientDrawable)

+1

Asegúrese de que no lo haga reutilice este dibujante en cualquier otro lugar antes de cambiar su color al correcto. En API <21, el dibujante mantiene su último conjunto de colores. –

+0

excelente, lo que quiero es esto, gracias –

4

hay una manera más fácil:

ShapeDrawable drawable = new ShapeDrawable(); 
drawable.getPaint().setColor(getResources().getColor(R.color.blue)); 
getActionBar().setBackgroundDrawable(drawable); 
+1

Su respuesta no tiene nada que ver con la pregunta ... lea más detenidamente. – neteinstein

+3

@NeTeInStEiN: Tiene todo que ver con la pregunta. Debes probarlo antes de descartarlo la próxima vez. –

+0

@kospol Puede explicar mejor su respuesta –

-1

Mi solución actual consiste en tener un dibujar sin la opción de color. Lo puse dentro de un diseño de marco y luego establecí dinámicamente el color de fondo del objeto de diseño de marco. Todavía es técnicamente una 'solución', pero es la opción más simple en mi opinión.

Archivo de diseño:

<FrameLayout 
    android:id="@+id/dateLayout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@color/SecondaryGreen"> 

    <ImageView 
     android:id="@+id/dateBox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/date_rectangle" /> 

</FrameLayout> 

Fecha del rectángulo del archivo Disponibles:

<shape xmlns:android="http://schemas.android.com/apk/res/android" ><size android:width="50dp" android:height="50dp"/><corners android:radius="5dp"/></shape> 

dinámica de representación:

mHolder.dateLayout.setBackgroundColor(getResources().getColor(R.color.SecondaryGreen)); 
+0

Lo siento muchachos. No me di cuenta de que no puedes dar forma a tu forma (es decir, mi forma tiene esquinas redondeadas, pero el color de fondo se rellena en todo el espacio para que no puedas distinguirlo). Esta solución solo funcionará para las formas que se ajusten a un marco, no a las formas redondas ni a los rectángulos con esquinas redondeadas. –

1

R.drawable.library_cirecle

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
<item android:id="@+id/outerRectangle"> 
    <shape android:shape="oval" > 
     <solid android:color="#FCD366" /> 

     <stroke 
      android:width="1dp" 
      android:color="@android:color/darker_gray" /> 
    </shape> 
</item> 

cambio de color en código

Drawable tempDrawable = getResources().getDrawable(R.drawable.library_cirecle); 
LayerDrawable bubble = (LayerDrawable) tempDrawable; (cast to root element in xml) 
GradientDrawable solidColor = (GradientDrawable) bubble.findDrawableByLayerId(R.id.outerRectangle); 
solidColor.setColor(colorToPaint); 
imageView.setImageDrawable(tempDrawable); 
+0

lo siento colorToPaint = getResources(). GetColor() –

-1

Establecer color Forma GradientDrawable utilizando un código hexadecimal/valor
0x Simplemente prefijo al valor de color hexadecimal.

GradientDrawable shape = new GradientDrawable(); 
    shape.setCornerRadius(16); 
    shape.setColor(0xff33b5e5); 
    ButtonStartSurvey.setBackground(shape); 
Cuestiones relacionadas