在我的应用程序中,我有一个非常酷的想法,即在发生事件时将背景(作为渐变)更改为其他渐变颜色。
这一切都必须发生dynamically
,我花了几个小时的时间。但它不起作用,因为当我使用以下策略时它会抛出stackOverflow error
。
因此,当您按下按钮时,此背景会在运行时稍微改变。
我的问题是,我可以使用不同的方法来实现这一目标吗?使用纯色背景很容易实现,但这不是我想要的。
绘制我使用的渐变背景:
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循环。
然后我想用
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
?