如何在运行时自定义 XML 中定义的自定义可绘制对象?
How to customize custom drawable defined in XML at runtime?
我制作了一个自定义的多层可绘制对象作为按钮的背景。有时,我希望这个可绘制层的一部分是蓝色的。有时我希望它是绿色的。重点是,它是一个变量,我希望它可以在关联的自定义视图中定义 XML.
这可能吗?如何在 XML 中编写可在运行时确定其值的可绘制对象?
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" />
是我想在运行时设置的。我的这个 class 的自定义视图已经收到我想在此处使用的颜色值 - 如何将它应用到这个可绘制对象的 XML?
像这样:
InsetDrawable drawable = (InsetDrawable) myButton.getBackground();
GradientDrawable shape = (GradientDrawable) drawable.getDrawable();
shape.setColor(Color.BLUE);
I made a custom, multi-layered drawable to act as the background for a button.
这假设 myButton
是您在上面提到的按钮,并且已经用
定义
android:background="@drawable/custom_button"
编辑
对于 API 级别 1 的方法:
创建一个 custom_shape.xml
可绘制对象:
<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>
编写一个方法来更改此可绘制对象的颜色并在其周围放置一个插图:
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);
}
我制作了一个自定义的多层可绘制对象作为按钮的背景。有时,我希望这个可绘制层的一部分是蓝色的。有时我希望它是绿色的。重点是,它是一个变量,我希望它可以在关联的自定义视图中定义 XML.
这可能吗?如何在 XML 中编写可在运行时确定其值的可绘制对象?
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" />
是我想在运行时设置的。我的这个 class 的自定义视图已经收到我想在此处使用的颜色值 - 如何将它应用到这个可绘制对象的 XML?
像这样:
InsetDrawable drawable = (InsetDrawable) myButton.getBackground();
GradientDrawable shape = (GradientDrawable) drawable.getDrawable();
shape.setColor(Color.BLUE);
I made a custom, multi-layered drawable to act as the background for a button.
这假设 myButton
是您在上面提到的按钮,并且已经用
android:background="@drawable/custom_button"
编辑
对于 API 级别 1 的方法:
创建一个 custom_shape.xml
可绘制对象:
<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>
编写一个方法来更改此可绘制对象的颜色并在其周围放置一个插图:
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);
}