2016-07-07 64 views
0

我想在按鈕按鈕上執行某種停止光功能,而是每種顏色都有兩種。所需的功能將是紅色,紅色,黃色,黃色,綠色和綠色。我試圖在每種顏色之間設置一個延遲,但它不會按順序發生,它只是增加了延遲,它們都立即顯示出來。按鈕變得可見按順序

這裏是我試圖做這個活動的片段:

Button previewButton = (Button) findViewById(R.id.preview_visual_button); 
     final Button redButton1 = (Button) findViewById(R.id.red_button_1); 
     final Button redButton2 = (Button) findViewById(R.id.red_button_2); 
     final Button yellowButton1 = (Button) findViewById(R.id.yellow_button_1); 
     final Button yellowButton2 = (Button) findViewById(R.id.yellow_button_2); 
     final Button greenButton1 = (Button) findViewById(R.id.green_button_1); 
     final Button greenButton2 = (Button) findViewById(R.id.green_button_2); 

     redButton1.setVisibility(View.GONE); 
     redButton2.setVisibility(View.GONE); 
     yellowButton1.setVisibility(View.GONE); 
     yellowButton2.setVisibility(View.GONE); 
     greenButton1.setVisibility(View.GONE); 
     greenButton2.setVisibility(View.GONE); 

     if(previewButton != null) { 
      previewButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int time = 100; 
        delay(time); 
       } 
      }); 
     } 
    } 

    public void delay(final int c){ 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(c); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Button redButton1 = (Button) findViewById(R.id.red_button_1); 
       Button redButton2 = (Button) findViewById(R.id.red_button_2); 
       Button yellowButton1 = (Button) findViewById(R.id.yellow_button_1); 
       Button yellowButton2 = (Button) findViewById(R.id.yellow_button_2); 
       Button greenButton1 = (Button) findViewById(R.id.green_button_1); 
       Button greenButton2 = (Button) findViewById(R.id.green_button_2); 

       redButton1.setVisibility(View.VISIBLE); 
       redButton2.setVisibility(View.VISIBLE); 
       yellowButton1.setVisibility(View.VISIBLE); 
       yellowButton2.setVisibility(View.VISIBLE); 
       greenButton1.setVisibility(View.VISIBLE); 
       greenButton2.setVisibility(View.VISIBLE); 
      } 
     }, c); 

    } 

編輯:

previewButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int time = 1000; 
        redButton1.setVisibility(View.VISIBLE); 
        delay(time); 
        redButton2.setVisibility(View.VISIBLE); 
        delay(time); 
        yellowButton1.setVisibility(View.VISIBLE); 
        delay(time); 
        yellowButton2.setVisibility(View.VISIBLE); 
        delay(time); 
        greenButton1.setVisibility(View.VISIBLE); 
        delay(time); 
        greenButton2.setVisibility(View.VISIBLE); 
       } 
      }); 
    } 

    public void delay(final int time) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(time); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

回答

0

因爲這基本上是postDelayed方法做什麼。它在指定的時間後運行runnable中的代碼。所以它延遲了100ms,然後運行只是立即打開所有的按鈕。此外,我不確定你在UI線程上調用Thread.sleep()時所要做的。我會建議編寫一個新的方法,在一個單獨的線程內運行Thread.sleep(),並在每對按鈕切換命令之間調用它。有點像這樣

public void pause(int time) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(time); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 
} 

然後基本上在每對按鈕切換語句之間調用它。這應該做的伎倆。

+0

執行此操作對我無效。即使移動主線程的延遲並刪除postDelayed也會產生相同的結果。有什麼建議麼? – thenry

+0

請將您寫的代碼專門發佈爲您的按鈕點擊處理程序。我不知道爲什麼這不起作用。另一種選擇是在每一次按鈕狀態改變調用之後調用postDelayed。 –

+0

請參閱編輯。它的行爲就好像它沒有讀取延遲。 – thenry