В моем приложении у меня была довольно крутая идея изменить фон (как градиент) на другие цвета градиента, когда произошло событие.
Все это должно было случиться dynamically
, и я потратил пару часов на это. Но это не работает, потому что выдает stackOverflow error
, когда я использую следующую тактику.
- Установить градиентный фон для linearLayout.
- Преобразование шестнадцатеричных цифр в 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 с помощью простого куска кода и некоторых циклов if, в которых я установил значения массива ret
сверху.
Затем я хотел создать новое шестнадцатеричное значение новых значений 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
.
Но у меня такое ощущение, что я слишком усердно старался изо всех сил ... и есть более простой способ сделать это.
Для вашего сведения, я не использовал поток таймера для обновления пользовательского интерфейса, но RefreshHandler
.
Кто-то знает, как я могу сделать это более эффективно или с лучшей тактикой, чтобы я не получил stackoverflow error
?