Возможно ли немедленно обновить свойства представления?

#java #android

#java #Android

Вопрос:

Я новичок в Android Studio, и я искал почти везде, но не нашел ничего, что работало бы для меня.

Я хочу обновлять представление сразу после изменения его цвета фона каждый раз в бесконечном цикле. Я пробовал с помощью invalidate (), но после нажатия вид по-прежнему остается белым. Как я могу перерисовать представление после изменения?

 public class Main extends AppCompatActivity {
    static int r = 0, g = 0, b = 0;
    static int current, direction;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final View view = findViewById(R.id.textView);
        final View root = view.getRootView();

        view.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                while(true) {
                    rainBow();
                    root.setBackgroundColor(Color.rgb(r, g, b));
                    view.invalidate();
                    root.invalidate();
                }
            }
        });
    }

    public static void rainBow() {
        if(r == 0 amp;amp; g == 0 amp;amp; b == 0) {
            current = 1;
            direction = 1;
        } else if(r == 255 amp;amp; g == 0 amp;amp; b == 0) {
            current = 2;
            direction = 1;
        } else if(r == 255 amp;amp; g == 255 amp;amp; b == 0) {
            current = 1;
            direction = -1;
        } else if(r == 0 amp;amp; g == 255 amp;amp; b == 0) {
            current = 3;
            direction = 1;
        } else if(r == 0 amp;amp; g == 255 amp;amp; b == 255) {
            current = 2;
            direction = -1;
        } else if(r == 0 amp;amp; g == 0 amp;amp; b == 255) {
            current = 1;
            direction = 1;
        } else if(r == 255 amp;amp; g == 0 amp;amp; b == 255) {
            current = 3;
            direction = -1;
        }

        switch(current) {
            case 1:
                r  = direction;
                break;

            case 2:
                g  = direction;
                break;

            case 3:
                b  = direction;
                break;
        }
    }
}
  

Комментарии:

1. Android, вероятно, блокирует ваш код по двум причинам. 1) Ваш цикл никогда не существует, что блокирует поток пользовательского интерфейса. Это запрещено. 2) Может быть, вы ускоряете циклический способ, чтобы у представления было время для обновления.

2. Я только что попытался добавить Thread.sleep(1000); но это все еще не работает

3. Обратите внимание, что вы меняете цвет фона root, а не цвет представления. Кроме того, вы не должны переводить поток пользовательского интерфейса в спящий режим. Нажав на вашу кнопку, вы запускаете фоновый поток, который регулярно (например, каждую секунду) меняет цвет.

4. Я пытался сделать это один раз, и это сработало, но в цикле это не запускает новый поток, это просто обновляет фон (я думаю), не показывая его. В любом случае, я только что попытался выполнить цикл в новом потоке, и когда вы касаетесь экрана, он становится черным на миллисекунду, а затем вылетает…

5. Спасибо!!!!!! Теперь это работает!! pastebin.com/xTyhs5S1