我制作了一个自定义的多层drawable作为按钮的背景。有时,我希望这个可绘制层的一部分是蓝色的。有时我希望它是绿色的。点是,它是一个变量,我希望它可以在关联的自定义视图XML中定义。
这可能吗?如何在XML中编写一个drawable,其值可以在运行时确定?
custom_button.xml
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/button_inset_horizontal_material"
android:insetTop="@dimen/button_inset_vertical_material"
android:insetRight="@dimen/button_inset_horizontal_material"
android:insetBottom="@dimen/button_inset_vertical_material">
<shape android:shape="rectangle">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="?attr/colorButtonNormal" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
</inset>
行<solid android:color="?attr/colorButtonNormal" />
是我想在运行时设置的。我有这个类的自定义视图已经收到我想在这里使用的颜色值 - 如何将它应用于这个drawable的XML?
答案 0 :(得分:3)
像这样:
InsetDrawable drawable = (InsetDrawable) myButton.getBackground();
GradientDrawable shape = (GradientDrawable) drawable.getDrawable();
shape.setColor(Color.BLUE);
我制作了一个自定义的多层drawable,作为按钮的背景。
这假定myButton
是您在上面引用并已使用
android:background="@drawable/custom_button"
修改
对于API级别1方法:
制作custom_shape.xml
drawable:
<shape android:shape="rectangle">
<corners android:radius="@dimen/control_corner_material" />
<solid android:color="?attr/colorButtonNormal" />
<padding android:left="@dimen/button_padding_horizontal_material"
android:top="@dimen/button_padding_vertical_material"
android:right="@dimen/button_padding_horizontal_material"
android:bottom="@dimen/button_padding_vertical_material" />
</shape>
编写一个方法来改变这个drawable的颜色并在其周围插入一个插图:
private void changeColor() {
// Get shape from XML
GradientDrawable shape = (GradientDrawable) getResources().getDrawable(R.drawable.custom_shape);
shape.setColor(Color.BLUE);
// Programmatically create Inset
InsetDrawable drawable = new InsetDrawable(shape,
getResources().getDimensionPixelSize(R.dimen.button_inset_horizontal_material),
getResources().getDimensionPixelSize(R.dimen.button_inset_vertical_material),
getResources().getDimensionPixelSize(R.dimen.button_inset_horizontal_material),
getResources().getDimensionPixelSize(R.dimen.button_inset_vertical_material));
// Apply to button
myButton.setBackground(drawable);
}