Динамический градиентный фон - PullRequest
0 голосов
/ 17 марта 2012

В моем приложении у меня была довольно крутая идея изменить фон (как градиент) на другие цвета градиента, когда произошло событие. Все это должно было случиться 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?

...