I\'m experimenting with Drawable backgrounds and have had no problems so far.
I\'m now trying to change the gradient background color at runtime.
Unfortunate
Yes! Found a way!
Had to forget about XML, but here's how I did it:
On my getView() overloaded function (ListAdapter) I just had to:
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);
And that gave me the same result as the XML background above. Now I can programmatically set the background color.
Try my code below:
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);
Method for generating random color:
public static int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(56), rnd.nextInt(256));
}
I tried using Phenome's solution for Button view. But somehow it did not work.
I came up with something else: (Courtesy: Android API Demo examples)
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;
}
}
}
Depending on your requirements, using a color state list instead of a fixed color for startColor and endColor might do what you want.