2016-08-13 18 views
0

毎秒coordinatorLayoutの背景色を変更したいと思います。
しかし、coordinatorLayoutの色は、最初の色REDからCOLORSアレイの最後の色、つまり#09FF00に直接変更されています。中間色はレイアウトに表示されませんが、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メソッドでは、人間の目ではそれを知覚するには速すぎる色を反復処理します。

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方法を変更します。

は、代わりにあなたはおそらく(1秒ごとに色で一時停止されます)このように、あなたのRunnableの内側の色を超えるループ反復を置くことになるでしょうこの:

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)); 
      } 

ループは非常に速く実行され、中間色を認識しません。私はその後changeColorは、それを使用する呼び出す前にCOLORSから単一の色を取得毎秒であなたのタイマ・ロジック・トリガ場合、変更

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

をお勧めします。このよう

...

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)); 

     } 
    }); 
} 
関連する問題