#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