2016-08-13 9 views
0

Я хочу изменить цвет фона coordinatorLayout каждую секунду.
Но, что я нахожу, это то, что цвет coordinatorLayout изменяется от начального цвета RED до непосредственно последнего цвета, то есть #09FF00 в массиве COLORS. Промежуточный цвет не отображается в макете, хотя они регистрируются в LogCat.
Что я делаю неправильно?Android - Динамически меняющийся цвет фона макета

public class ColorActivity extends AppCompatActivity { 

private static String COLORS [] = {"#FF0000", "#0000FF", "#09FF00"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_detect); 

    final CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.fullscreenview); 
    coordinatorLayout.setBackgroundColor(Color.RED); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
      changeColor(coordinatorLayout); 
     } 
    }).start(); 

} 

private void changeColor(final CoordinatorLayout coordinatorLayout) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      for (String color: COLORS) { 
       Log.i("COLOR", color); 
       coordinatorLayout.setBackgroundColor(Color.parseColor(color)); 
      } 
     } 
    }); 
} 

} 

ответ

0

Переход происходит быстро. В вашем методе run вы перебираете цвета, которые слишком быстры для человеческого глаза, чтобы воспринимать его.

Вместо этого вы, вероятно, хотите поставить итерации цикла над цветами внутри вашего Runnable, как это (который будет пауза в каждом цвете в течение одной секунды):

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     for (final String color: COLORS) { 
      Log.i("COLOR", color); 
      changeColor(coordinatorLayout, color); 
      try { 
       Thread.sleep(1000); 
      } catch (Exception e) {/* ... */} 
     } 
    } 
}).start(); 

А затем изменить метод changeColor к это:

private void changeColor(final CoordinatorLayout coordinatorLayout, final String color) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      coordinatorLayout.setBackgroundColor(Color.parseColor(color)); 
     } 
    }); 
} 
+0

Как справиться с этим? –

+0

Не работает. Та же проблема. –

+0

Я обновил код. – TR4Android

0

на самом деле логично выпустить в коде

for (String color: COLORS) { 
       Log.i("COLOR", color); 
       coordinatorLayout.setBackgroundColor(Color.parseColor(color)); 
      } 

цикл будет выполняться так быстро, что вы не поймете промежуточные цвета. Я предлагаю изменить

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       int colorIndex = 0; 
       do{ 
       try { 
        changeColor(coordinatorLayout,COLORS[colorIndex++]); 
        Thread.sleep(100); 
       }catch (Exception e) { 
        e.printStackTrace(); 
       } 
       }while(iteration < COLORS.length) 
      } 
     }).start(); 


    private void changeColor(final CoordinatorLayout coordinatorLayout,final String color) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
       Log.i("COLOR", color); 
      coordinatorLayout.setBackgroundColor(Color.parseColor(color)); 
     } 
    }); 
} 
+0

@mehrdad переполнение стека жалуется, что у меня недостаточно репутации, чтобы принимать изменения ... :( –

+0

как-то обновлено сейчас ..... :) Спасибо –

0

если ваш таймер логический триггер в каждую секунду, то получите один цвет от ЦВЕТОВ до вызова changeColor, затем используйте его.

Как это ...

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(1000); 
      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
      //get single color here 
      //update color and pass it 
      changeColor(coordinatorLayout, color); 
     } 
    }).start(); 


    private void changeColor(final CoordinatorLayout coordinatorLayout, color mcolor) { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
       Log.i("COLOR", mcolor); 
       coordinatorLayout.setBackgroundColor(Color.parseColor(mcolor)); 

     } 
    }); 
} 
Смежные вопросы