móviles - manual de programacion android pdf
Cambiar los colores de fondo degradado en Android en tiempo de ejecución (4)
Estoy experimentando con fondos dibujables y no he tenido problemas hasta ahora.
Ahora estoy tratando de cambiar el color de fondo degradado en tiempo de ejecución.
Desafortunadamente, no hay una API para cambiarlo en tiempo de ejecución, parece. Ni siquiera tratando de mutar () lo dibujable, como se explica aquí: Mutaciones dibujables
El ejemplo de XML se ve así. 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 tendrían que ser modificados programáticamente en el tiempo de ejecución.
¿Hay otra manera de crear este fondo degradado en tiempo de ejecución? Tal vez incluso no usar XML por completo?
¡Sí! ¡Encontre una forma!
Tuve que olvidarme de XML, pero así es como lo hice:
En mi función getView () sobrecargada (ListAdapter) 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 programar el color de fondo programáticamente.
Dependiendo de sus requisitos, usar una lista de estados de color en lugar de un color fijo para startColor y endColor puede hacer lo que quiera.
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 la API de 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;
}
}
}
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 color al azar:
public static int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(56), rnd.nextInt(256));
}