动态改变xml中定义的形状属性?

时间:2011-01-25 05:43:38

标签: android xml

目前使用以下xml代码作为我正在制作的程序中按钮的背景。但是,我想在我的代码中动态更改背景渐变。

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/buttonshape"
 android:shape="rectangle">
 <gradient android:startColor="#F0F0F0" android:endColor="#A0A0A0"
  android:angle="270" android:id="@+id/buttonGradient"/>
 <corners  android:topLeftRadius="7dp"
  android:topRightRadius="7dp" />
</shape>

首先,我决定使用xml,我只是创建自己的类来处理这个问题。但是,我意识到没有好的课程可以延伸。 GradientDrawable没有任何明显的方法来绕过角落。 RoundRectShape没有任何方法可以给我一个渐变。但是,我也不知道shaperawable中渐变/角落的任何访问者。我认为它归结为我不明白这个形状是如何被定义的事实(我把它从其他地方使用的例子中拉出来)。我定义的每个xml视图都包含在&lt;中的所有属性中。 /&GT;标签。这是不同的。什么是&lt;渐变&gt;和&lt;角落&gt;?我无法在API /开发人员工具中找到它们。我怎样才能在代码中动态改变它们?

2 个答案:

答案 0 :(得分:2)

Seth,您可以尝试使用GradientDrawable的重载构造函数:

public GradientDrawable (GradientDrawable.Orientation orientation, int[] colors)

这允许您设置渐变的方向,并传递将提供渐变的颜色数组。 有一种设置圆角的方法:

public void setCornerRadius (float radius)

您可以在GradientDrawable上执行。

我提供这个答案,虽然我还没有让它自己工作:(也许你会有更好的运气。

答案 1 :(得分:0)

您可以使用一点Xpath ..

通过“动态”我不知道在什么平台上,但在C#中,以下行可能会引导您找到解决方案。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("path to xml file");
XmlNodeList gradientNodeList = xmlDoc.SelectNodes("//gradient");
foreach(XmlNode gradient in gradientNodeList){
    string startColor = gradient.Attributes["android:startColor"].Value; //GET
    gradient.Attributes["android:startColor"].Value = "#FFF"; //SET Custom Value
}
//OR Simply 
XmlNode xn = xmlDoc.SelectSingleNode("/shape/gradient"); //and same as above

或者,您可以使用XSLT 输入xml转换为所需的格式。