动态渐变背景

时间:2012-03-17 13:49:21

标签: java android background android-linearlayout

在我的应用程序中,我有一个非常酷的想法,即在发生事件时将背景(作为渐变)更改为其他渐变颜色。 这一切都必须发生dynamically,我花了几个小时的时间。但它不起作用,因为当我使用以下策略时它会抛出stackOverflow error

  • 设置linearLayout的gradientbackground。
  • 将十六进制数字转换为RGB。
  • 计算新的RGB值。
  • 转换回十六进制值。
  • 将新的十六进制值作为背景。

因此,当您按下按钮时,此背景会在运行时稍微改变。

我的问题是,我可以使用不同的方法来实现这一目标吗?使用纯色背景很容易实现,但这不是我想要的。

绘制我使用的渐变背景:

  GradientDrawable g = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, Colors); //Colors is an array with 2 heximal values as int.

  lnrLayout.setBackgroundDrawable(g);

使用以下代码片段计算RGB值。

    int[] ret = new int[3];
    int[] ret2 = new int[3];

    for(int i=0; i<3; i++){
        ret[i] = hexToInt(rgb1.charAt(i*2+2), rgb1.charAt(i*2+1+2)); 
        ret2[i] = hexToInt(rgb2.charAt(i*2+2), rgb2.charAt(i*2+1+2));
    }

hexToInt方法,

 public int hexToInt(char a, char b){
    int x = a < 65 ? a-48 : a-55;
    int y = b < 65 ? b-48 : b-55;
    return x*16+y;
 }

然后我用一段简单的代码计算了下一个rgb代码,并且我已经从上面设置了ret数组的一些if循环。 然后我想用

创建新RGB值的新十六进制值
    String hex = makeNewHex(ret[0],ret[1],ret[2]);
    String hex2 = makeNewHex(ret2[0],ret2[1],ret2[2]);

    public String makeNewHex(int r, int g, int b) {
        String n;
        return n = toHex(r,g,b);
    }

    public String toHex(int r, int g, int b) {
        return "#" + toBrowserHexValue(r) + toBrowserHexValue(g) + toBrowserHexValue(b);
    }

    private static String toBrowserHexValue(int number) {
        StringBuilder builder = new StringBuilder(Integer.toHexString(number & 0xff));

        while (builder.length() < 2) {
            builder.append("0");
        }

        return builder.toString().toUpperCase();
    }

此后代码不再导入,因为我只需稍微调整十六进制值,因此它与gradientDrawable方法兼容。

但是我感觉我的确做得太过努力了......而且有一种方法可以更轻松地实现这一目标。

为了您的信息,我没有使用计时器线程来更新UI,而是使用RefreshHandler

有人知道我如何能更有效地做到这一点,或者采用更好的策略,所以我不会得到stackoverflow error

0 个答案:

没有答案