目前使用以下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 /开发人员工具中找到它们。我怎样才能在代码中动态改变它们?
答案 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转换为所需的格式。