Cambio de colores de fondo degradados en Android en tiempo de ejecución

Estoy experimentando con fondos Drawable y no he tenido problemas hasta ahora.

Ahora trato de cambiar el color de fondo del degradado en tiempo de ejecución.

Lamentablemente, parece que no hay API para cambiarlo en tiempo de ejecución. Ni siquiera al tratar de mutar () el dibujable, como se explica aquí: mutaciones Drawable

El XML de ejemplo se ve así. Funciona, como se esperaba.

   

Lamentablemente, quiero una lista con varios colores, y tendrían que ser modificados programáticamente en tiempo de ejecución.

¿Hay alguna otra manera de crear este fondo degradado en tiempo de ejecución? ¿Quizás incluso no usar XML por completo?

¡Sí! ¡Encontró un camino!

Tuve que olvidarme de XML, pero así es como lo hice:

En mi función getView () sobrecargada (ListAdapter) solo tuve que:

  int h = v.getHeight(); ShapeDrawable mDrawable = new ShapeDrawable(new RectShape()); mDrawable.getPaint().setShader(new LinearGradient(0, 0, 0, h, Color.parseColor("#330000FF"), Color.parseColor("#110000FF"), Shader.TileMode.REPEAT)); v.setBackgroundDrawable(mDrawable); 

Y eso me dio el mismo resultado que el fondo XML anterior. Ahora puedo configurar programáticamente el color de fondo.

Intenté usar la solución de Phenome para la vista de botones. Pero de alguna manera no funcionó.

Se me ocurrió algo más: (Cortesía: Ejemplos de demostración de Android API)

 package com.example.testApp; import android.app.Activity; import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import android.view.View; public class TetApp extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); View v = findViewById(R.id.btn); v.setBackgroundDrawable( new DrawableGradient(new int[] { 0xff666666, 0xff111111, 0xffffffff }, 0).SetTransparency(10)); } public class DrawableGradient extends GradientDrawable { DrawableGradient(int[] colors, int cornerRadius) { super(GradientDrawable.Orientation.TOP_BOTTOM, colors); try { this.setShape(GradientDrawable.RECTANGLE); this.setGradientType(GradientDrawable.LINEAR_GRADIENT); this.setCornerRadius(cornerRadius); } catch (Exception e) { e.printStackTrace(); } } public DrawableGradient SetTransparency(int transparencyPercent) { this.setAlpha(255 - ((255 * transparencyPercent) / 100)); return this; } } } 

Prueba mi código a continuación:

  int[] colors = new int[2]; colors[0] = getRandomColor(); colors[1] = getRandomColor(); GradientDrawable gd = new GradientDrawable( GradientDrawable.Orientation.TOP_BOTTOM, colors); gd.setGradientType(GradientDrawable.RADIAL_GRADIENT); gd.setGradientRadius(300f); gd.setCornerRadius(0f); YourView.setBackground(gd); 

Método para generar colores aleatorios:

 public static int getRandomColor(){ Random rnd = new Random(); return Color.argb(255, rnd.nextInt(256), rnd.nextInt(56), rnd.nextInt(256)); } 

Dependiendo de sus requisitos, usar una lista de estado de color en lugar de un color fijo para startColor y endColor podría hacer lo que quiera.