我有一个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()和自己做渐变更简单的方法?我试图使用的一些课程记录很差。
答案 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)