3

是否可以在比 API 16 (JellyBean) 更低的 API 级别上设置渐变的颜色数组?

我目前正在使用:

GradientDrawable gd = (GradientDrawable)this.getBackground();
int[] colors = {0xFFFF0000, 0xFFCC0099};
gd.setColors(colors);

效果很好,但我希望支持 API Level 8 (Froyo) 或 10 (Gingerbread v2)。

4

1 回答 1

6

我认为没有一种简单的方法可以做到这一点,所以我的建议是:GradientDrawable根据旧参数的参数创建一个新的(对于 16 以下的 API)。感谢@StephenNiedzielski指出了这里的缺陷——<code>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 的实现不应该改变(因为它们不再被更新)。

如果它适合您的喜好,您可以使用反射来访问GradientState内部类。基本上,您需要模拟该方法执行的调用gd.mGradientState.mOrientation(如评论中所述) 。getOrientation()由于这两个都是私有的,因此您必须使用 Reflection

于 2013-01-09T21:25:08.370 回答