我正在尝试Drawable背景,到目前为止没有任何问题.
我现在正试图在运行时更改渐变背景颜色.
不幸的是,似乎没有API可以在运行时更改它.甚至没有尝试变异()drawable,如下所述:可绘制的突变
示例XML看起来像这样.它正如预期的那样有效.
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#330000FF"
android:endColor="#110000FF"
android:angle="90"/>
</shape>
Run Code Online (Sandbox Code Playgroud)
遗憾的是,我想要一个具有各种颜色的列表,并且它们必须在运行时以编程方式进行编程.
还有另一种方法可以在运行时创建此渐变背景吗?甚至可能不完全使用XML?
我想使用带有径向渐变的shape drawable作为View的背景.根据javadoc,渐变的半径可以设置为特定值(可能是像素)或百分比:
机器人:gradientRadius
渐变的半径,仅用于径向渐变.
可能是浮点值,例如"1.2".
可以是小数值,它是附加%或%p的浮点数,例如"14.5%".%后缀总是表示基本大小的百分比; 可选的%p后缀提供相对于某个父容器的大小.
如果我错了,请纠正我,但在这里使用像素值是完全没用的,因为这个渐变看起来完全不同于一个屏幕密度到另一个(测试,是的,这是真的).我试着使用%和%p值,但它们根本不起作用.
我深入研究了Android源代码,了解了如何处理gradientRadius并在GradientDrawable类中找到它:
TypedValue tv = a.peekValue(
com.android.internal.R.styleable.GradientDrawableGradient_gradientRadius);
if (tv != null) {
boolean radiusRel = tv.type == TypedValue.TYPE_FRACTION;
st.mGradientRadius = radiusRel ?
tv.getFraction(1.0f, 1.0f) : tv.getFloat();
} else ...
}
Run Code Online (Sandbox Code Playgroud)
啊哈!因此,所有添加%或%p确实将我的值除以100.(我测试了这一点,因为TypeValue.getFraction()的文档更加不清楚).65%变为0.65.有道理,但没有用处.
那么使用gradientRadius的最佳方法是什么?
PS.我使用GradientDrawable以编程方式添加了我的背景,我得到了理想的结果.我使用GradientDrawable.setGradientRadius()来获取相对于视图宽度的值,并在设备之间获得一致的渐变.