Android更改形状可绘制颜色

问题描述:

我想更改我的进度栏的渐变颜色。现在,我可以将其更改为纯色,但我无法将其更改为渐变色。Android更改形状可绘制颜色

LayerDrawable progressDrawable = (LayerDrawable) myProgressBar.getProgressDrawable(); 

// get the color drawable of the progress bar 
Drawable primaryColor = progressDrawable.getDrawable(1); 

// set the new color. 
primaryColor.setColorFilter(ContextCompat.getColor(getContext(), R.color.yellow), PorterDuff.Mode.SRC_OVER); 

取而代之的是纯色我想改变渐变色。

编辑我可绘制文件

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:id="@android:id/background"> 
    <shape> 
     <corners android:radius="5dip" /> 
     <gradient 
      android:startColor="@color/gray300" 
      android:centerColor="@color/gray400" 
      android:centerY="0.75" 
      android:endColor="@color/gray500" 
      android:angle="270" 
      /> 
    </shape> 
</item> 

<item 
    android:id="@+id/progress"> 
    <clip> 
     <shape> 
      <corners 
       android:radius="5dip" /> 
      **I want to change this gradient color** 
      <gradient 
      android:startColor="#33FF33" 
      android:endColor="#008000" 
      android:angle="270" /> 
     </shape> 
    </clip> 
</item> 

</layer-list> 

试试这个

GradientDrawable bgShape = (GradientDrawable) myProgressBar.getBackground().getCurrent(); 
bgShape.setColor(Color.YELLOW); 
+1

我得到的错误'android.graphics.drawable.LayerDrawable不能转换为android.graphics.drawable.GradientDrawable'。我已经包含可绘制文件。 –

+0

编辑我的答案 – ZeroOne

这里是我的实现:绘制动画彩虹渐变。很酷,如果我真的这么说。它不是基于XML的,但可以做成,它确实使用渐变。也许它会给你一些想法。

设置:

pb = (ProgressBar) findViewById(R.id.progressbar_Horizontal); 
GradientDrawable rainbow = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] {Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED}); 

AnimationDrawable ad = getProgressBarAnimation(); 
pb.setBackgroundDrawable(ad); 

和动画:

private AnimationDrawable getProgressBarAnimation(){ 

GradientDrawable rainbow1 = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] {Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW}); 

GradientDrawable rainbow2 = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] { Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN});   

GradientDrawable rainbow3 = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] { Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE, Color.CYAN }); 

GradientDrawable rainbow4 = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] { Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA, Color.BLUE }); 

GradientDrawable rainbow5 = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] { Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED, Color.MAGENTA }); 

GradientDrawable rainbow6 = new GradientDrawable(Orientation.LEFT_RIGHT, 
     new int[] {Color.MAGENTA, Color.BLUE, Color.CYAN, Color.GREEN, Color.YELLOW, Color.RED }); 


GradientDrawable[] gds = new GradientDrawable[] {rainbow1, rainbow2, rainbow3, rainbow4, rainbow5, rainbow6}; 

AnimationDrawable animation = new AnimationDrawable(); 

for (GradientDrawable gd : gds){ 
    animation.addFrame(gd, 100); 

} 

animation.setOneShot(false); 

return animation; 

}