2012-10-10 8 views
1

Мне нужно сделать фоновую вспышку или мигать, меняя каждую секунду. Я написал этот код:Как сделать фоновый рисунок макета в андроиде?

int colours[]={0xff00ff00, 0xffff0000, 0xff0000ff,0xffffffff}; 
RelativeLayout fondo; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    fondo = (RelativeLayout) findViewById(R.id.fondo); 
    this.fondo.setBackgroundColor(colours[0]); 
    this.fondo.setOnTouchListener(this); 
} 

Вот метод onTouch:

public boolean onTouch(View v, MotionEvent event) { 
    if(event.getAction() == MotionEvent.ACTION_UP) { 
     int i=1; 
     long delay= 1000; 
     long time = System.currentTimeMillis(); 

     while(true) { 
      long time2 = System.currentTimeMillis(); 
      long time3 = (time2 - time); 
      if (time3 > delay) { 
       this.fondo.setBackgroundColor(colours[i]); 
       Log.d("DEBUG", "EEEEEEEEEEEEEEEEEEEEEEEEEEEEE"); 
       time = System.currentTimeMillis(); 
       i++; 
       if (i >= colores.length) 
        i=0; 
      } 
     } 
    } 
    return true; 
} 

Моя проблема заключается в том, что я не могу изменить цвет фона каждый второй, но я могу написать Log.d (» DEBUG ") каждую секунду.

+0

Попробовать аннулирует вид после установки цвета фона, увидеть, если он работает. – Wenhui

+0

Вы получаете ANR? Возможно, вы захотите изучить использование Handler с периодическим запуском. Он будет ссылаться на поток пользовательского интерфейса, и вы можете настроить его, чтобы просто пропустить ваш массив с каждым проходом. Он также должен автоматически недействительно –

+0

Благодарим вас за ответ так быстро. Я попробую. Я знаю, что могу делать это с помощью нитей. но я хотел попробовать с этим. Спасибо – croigsalvador

ответ

7

Вы должны использовать AnimationDrawable.

Если вы используете бесконечный цикл в UI Thread это вызывает ANR (Android не отвечает) Window

public boolean onTouch(View v, MotionEvent event) { 

     final int DELAY = 100; 

     if(event.getAction() == MotionEvent.ACTION_UP) { 


      RelativeLayout fondo = (RelativeLayout) findViewById(R.id.fondo); 

      ColorDrawable f = new ColorDrawable(0xff00ff00); 
      ColorDrawable f2 = new ColorDrawable(0xffff0000); 
      ColorDrawable f3 = new ColorDrawable(0xff0000ff); 
      ColorDrawable f4 = new ColorDrawable(0xff0000ff); 

      AnimationDrawable a = new AnimationDrawable(); 
      a.addFrame(f, DELAY); 
      a.addFrame(f2, DELAY); 
      a.addFrame(f3, DELAY); 
      a.addFrame(f4, DELAY); 
      a.setOneShot(false); 

      fondo.setBackgroundDrawable(a); // This method is deprecated in API 16 
      // fondo.setBackground(a); // Use this method if you're using API 16 
      a.start(); 
     } 
     return true; 
    } 
+0

Большое спасибо. Я не знал об ANR, с бесконечными циклами Android. Это сработало. в совершенстве. Большое спасибо!! снова – croigsalvador

+0

Нет проблем .. :) –

+0

Как я могу сделать это без метода касания, попробовал несколько вещей и не работал –

0

Вам необходимо использовать таймер и обработчик. в обработчике меняют цвет фона. есть хороший пример here, что вы можете настроить его на основе ваших потребностей.

+0

Большое спасибо. – croigsalvador

Смежные вопросы