Android - 动态设置drawable的渐变

时间:2011-03-08 14:43:04

标签: java android

我有一个XML资源的drawable,我想使用那个drawable但动态设置渐变颜色。到目前为止,我有这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:radius="3dip">
    </corners>
    <gradient
        android:angle="90"
        android:type="linear"
        android:startColor="#FFFFFFFF"
        android:centerColor="#FFFF0000"
        android:endColor="#FFFF0000">
    </gradient>
</shape>

现在我想通过在运行时获取drawable,将其转换为GradientDrawable并使用方法设置颜色,我可以动态制作颜色。但是,GradientDrawable没有这样的方法,只能在构造函数中设置颜色。我发现这很奇怪,因为渐变的所有其他方面都是可设置的。有没有比覆盖onDraw()和自己做渐变更简单的方法?我试图使用的一些课程记录很差。

4 个答案:

答案 0 :(得分:1)

资源主要是静态的,通常不允许修改。某些资源类型允许您“克隆”可变副本。 GradientDrawable仅允许您在contstuctor中设置颜色(如您所发现的),因此如果要在运行时动态控制颜色,则需要在内部创建颜色,或者更好的是,选择固定数量的颜色之一来自资源的背景。 如前所述,使用setBackgroundDrawable()在运行时安装后台。 无需通过判断,只需Get-R-Done!

答案 1 :(得分:0)

您可以动态地为视图设置为可绘制的背景。

view.setBackgroundDrawable(R.drawable.your_drawable_id);

答案 2 :(得分:0)

制作一个GradientDrawable类,如下所示:

public class RoundedDrawable extends GradientDrawable {

        public RoundedDrawable(int shape, int solidColor, int strokeWidth,
     int strokeColor, float[] fourRadii) {

            this.mutate();
            this.setShape(shape);
            this.setColor(solidColor);
            this.setStroke(strokeWidth, strokeColor);
            this.setCornerRadii(fourRadii);
        }
    }

现在在您的活动中使用此功能:

公共类AAActivity扩展了Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_transaction_layout);

    RoundedDrawable customBg;

    RelativeLayout relList = (RelativeLayout) findViewById(R.id.relList);
    float radii[]={5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f, 5.0f};
    customBg = new RoundedDrawable(GradientDrawable.RECTANGLE,Color.parseColor("#FFFFFF"),
            2, Color.parseColor("#8C8C8C"),radii);
    relList.setBackgroundDrawable(customBg);

    LinearLayout linearItemsRow = (LinearLayout) findViewById(R.id.linearItemsRow);
    float[] rowRadii={5.0f, 5.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f};
    customBg = new RoundedDrawable(GradientDrawable.RECTANGLE,Color.parseColor("#CBCBCB"),
            0, 0, rowRadii);
    linearItemsRow.setBackgroundDrawable(customBg);


}

}

希望这会有所帮助。

答案 3 :(得分:0)

班级

final class MyGradientDrawable extends GradientDrawable {
        MyGradientDrawable(int fromColor, int toColor) {
            super(Orientation.BOTTOM_TOP, new int[]{fromColor, toColor});

            setCornerRadius(0);
            setGradientType(LINEAR_GRADIENT);
            setGradientRadius(90);
        }
    }

用法

  final int firstColor = ContextCompat.getColor(requireContext(), R.color.my_first_color);
  final int secondColor = ContextCompat.getColor(requireContext(), R.color.my_second_color);
  final MyGradientDrawable myGradBg = new MyGradientDrawable(firstColor, secondColor);

  myView.setBackground(myGradBg)