2013-02-25 44 views
3

這裏是我的代碼:在Android中,如何更改按鈕的顏色,暫停幾秒鐘,然後再次更改它?

public class TestActivity extends Activity {  

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     start(); 
    } 

    private void start() { 
     setContentView(R.layout.main); 

     LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout); 

     Button button = new Button(this); 

     layout.addView(button); 

     button.getBackground().setColorFilter(new LightingColorFilter(0x00000000, 0x0000FF00)); // green 
     button.invalidate(); 

     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     button.getBackground().setColorFilter(new LightingColorFilter(0x00000000, 0x000000FF)); // blue 
     button.invalidate(); 
    } 
} 

這短短3秒後顯示一個藍色按鈕;它從不顯示爲綠色。

我想,如果我的大腦正常工作,我可以從這些職位之一找出答案:

Why isn't view.invalidate immediately redrawing the screen in my android game

How to force a view to redraw immediately before the next line of code is executed

How to force an entire layout View refresh?

回答

2

你不應該睡在UI線程上,因爲這會掛起你的界面。相反,在最初將顏色設置爲綠色後,您可以創建一個處理程序(在UI線程上,因此它將使用該線程處理消息),然後使用Handler.postDelayed發送將在3秒內處理的消息。在Runnable中,您傳遞給postDelayed您可以將顏色設置爲藍色。

1

你在睡覺的主在設置顏色後,UI幾乎立即進入線程。這意味着線程在獲得重繪機會之前被鎖定。

對此的一個解決方案是使用線程。設置背景顏色,然後使用另一個線程進入睡眠狀態,完成後調用主(UI)線程再次更改顏色。

您可以嘗試查找AsyncTaskThreading