2011-02-09 14 views
15

Estoy experimentando con fondos Drawable y no he tenido problemas hasta el momento.Cambiando los colores de fondo del degradado en Android en tiempo de ejecución

Estoy tratando de cambiar el color de fondo del degradado en tiempo de ejecución.

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

El XML de muestra tiene este aspecto. Funciona, como se esperaba.

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:startColor="#330000FF" 
     android:endColor="#110000FF" 
     android:angle="90"/> 
</shape> 

Lamentablemente, quiero una lista con varios colores, y que tendrían que ser alterado mediante programación en tiempo de ejecución.

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

Respuesta

32

Sí! ¡Encontró un camino!

tuvieron que olvidar XML, pero aquí es cómo lo hice:

En mi getView() función sobrecargada (ListAdapter) sólo tenía 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 como el fondo XML anterior. Ahora puedo configurar programáticamente el color de fondo.

+2

¿Es posible dar un valor de ángulo arriba? – Ahmed

+1

Si está utilizando esto en una actividad, es posible que desee ejecutar esto, p. en onWindowFocusChanges() en lugar de onCreate(). –

0

Dependiendo de sus requisitos, usando un color state list en lugar de un color fijo para startColor y endColor puede hacer lo que quiera.

+0

Interesante alternativa, pero realmente necesito algo más dinámico. Es una lista que muestra información de diferentes proveedores conectables. Cada proveedor tiene un color personalizado, por lo que el usuario sabe de dónde proviene esa información. Sé que no hay mucha información, pero quizás ayude. – Phenome

9

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

me ocurrió otra cosa: (Cortesía: ejemplos de la API de demostración Android)

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; 
     } 
    } 
} 
0

Prueba mi código de abajo:

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 la generación de color al azar:

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