Android GradientDrawable可设置旧API级别的颜色

Android GradientDrawable可设置旧API级别的颜色,android,Android,是否可以在低于API 16(JellyBean)的API级别上设置形状中渐变的颜色数组 我目前正在使用: GradientDrawable gd = (GradientDrawable)this.getBackground(); int[] colors = {0xFFFF0000, 0xFFCC0099}; gd.setColors(colors); 这很好,但我希望支持API级别8(Froyo)或10(Gingerbread v2)。我认为没有一种简单的方法可以做到这一点,因此我建议:基于

是否可以在低于API 16(JellyBean)的API级别上设置形状中渐变的颜色数组

我目前正在使用:

GradientDrawable gd = (GradientDrawable)this.getBackground();
int[] colors = {0xFFFF0000, 0xFFCC0099};
gd.setColors(colors);
这很好,但我希望支持API级别8(Froyo)或10(Gingerbread v2)。

我认为没有一种简单的方法可以做到这一点,因此我建议:基于旧API的参数创建一个新API(对于16以下的API)。感谢您指出此处的缺陷-
getOrientation()
在API 16下不可用

如果不进行反射,就无法实现这一点,因为您需要绘制对象的方向才能重新创建它。如果已经有方向,可以执行以下操作:

GradientDrawable gd = (GradientDrawable) getBackground();
int[] colors = {0xFFFF0000, 0xFFCC0099};
if (android.os.Build.VERSION.SDK_INT >= 16) {
    gd = gd.mutate(); // For safe resource handling
    gd.setColors(colors);
} else {
    // Fallback for APIs under 16.
    GradientDrawable ngd = new GradientDrawable(/* Orientation variable */, colors);
    // You may have to set other qualities of `ngd` here to make it match.
    setBackgroundDrawable(ngd);
}
因此,如果没有这些信息,您将不得不在16以下的API上使用反射。虽然它是黑客的,但它相当安全,因为这些API的实现永远不会改变(因为它们不再被更新)


如果你喜欢,你可以用。基本上,您需要模拟
getOrientation()
方法执行的调用
gd.mGradientState.mOrientation
(如注释中所述)。因为这两个都是私人的,所以您必须这样做。

Oops。我忘了
mutate()
!但那真的很糟糕。我需要这个形状的其余部分才能工作。我想我必须用Java创建形状。我是否能够引用带有Id的形状并修改其属性,还是每次都必须从头开始创建?我认为您可能必须重新创建它,因为
mutate()
不会创建新对象,只会重新初始化它。我可能会创建一个类,比如
GradientDrawable状态
,其中包含需要保留的值,然后每次从该自定义状态创建一个新的
GradientDrawable
。我知道这看起来很难看也没必要,但这可能是你最好的机会。反射是另一种选择,但听起来这是唯一的方法。您如何知道
GradientDrawable状态
将封装整个
形状
对象?尽管存在误导性,
GradientDrawable
表示整个形状(请参阅)。它有这样的方法可以帮助你设置形状的其他细节。@StephenNiedzielski你说得绝对正确,我想知道为什么有人会对它投赞成票。似乎唯一的方法是通过反射(调用
gd.mGradientState.mOrientation
)。我会在有时间的时候更新我的答案。