在运行时在Android上更改渐变背景颜色

我正在尝试Drawable背景,到目前为止没有任何问题。

我现在试图在运行时更改渐变背景颜色。

不幸的是,似乎没有API在运行时改变它。 甚至没有尝试mutate()drawable,如下面的解释: 可绘制的突变

示例XML看起来像这样。 它按预期工作。

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

不幸的是,我想要一个具有各种颜色的列表,而且它们必须在运行时进行编程修改。

有没有另外一种方法在运行时创build这个渐变背景? 也许甚至不使用XML?

Solutions Collecting From Web of "在运行时在Android上更改渐变背景颜色"

是! find了一个方法!

不得不忘记XML,但我是这么做的:

在我的getView()重载函数(ListAdapter)我只是:

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

这给了我上面的XML背景相同的结果。 现在我可以编程设置背景颜色。

我尝试使用Phenome的button视图的解决scheme。 但不知何故,这并没有奏效。

我想出了一些其他的东西:(礼貌: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; } } } 

根据您的要求,使用颜色状态列表而不是固定颜色的startColor和endColor可能会做你想做的事情。

试试我的代码如下:

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

产生随机颜色的方法:

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