Android: cambia el color de forma en tiempo de ejecución

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.

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 tienen el mismo problema … no falla … ¡pero el color no cambia!

     

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

¿Cualquier pista? He pasado todo el día buscando en Google … y se está poniendo bastante molesto …

ACTUALIZAR:

Cuando trato de hacer lo mismo con esta forma:

     

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

Ahora estoy creando un Drawable como el precomstackdor … ya que no pude cambiar el color a nada que no sea negro, incluso después de probar el hexágono O que 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 una solución … ¡una solución para la primera pregunta es lo que realmente estoy buscando! Apreciaré cualquier ayuda, por supuesto!

Vea 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 un 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: Acerca del color, intente configurar 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 y 0xff es un objeto completamente opaco.

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

El método setColor solicita correctamente un redibujado en el elemento (si en xml usaste el elemento siempre se convertirá en un GradientDrawable)

Hay una manera más fácil:

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

R.drawable.library_cirecle

         

Cambiar el color en el 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); 

Esto es lo que estoy haciendo en un fondo de pantalla en vivo donde modifico un Drawable 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()); 

Editar: Declaraciones de tipo:

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

Editar 2:

Pruebe esto en ese caso:

 int color = (0xFF000000 | yourParsedColor) 

Luego establece ese color.

Mi solución actual implica tener un drawable 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:

    

Fecha del archivo extraíble del rectángulo:

  

Representación dinámica:

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

Establecer el color de la forma GradientDrawable usando el código / valor hexadecimal
Simplemente prefija 0x al valor de color hexadecimal.

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