2014-12-06 77 views
0

我有一個程序,它以螺旋形狀繪製一堆紅色框。我有一切工作,除了我不知道如何推遲這個過程,所以你可以看到螺旋形成。 我把我的代碼放在for循環中,並用while循環和500ms延遲將它移動到Runnable。該程序旨在停止onClick或如果它運行49次。使用處理程序將重複任務延遲有限次

我太心急,看最後的結果,因爲我的手機剛減慢當我開始螺旋,且沒有動畫

Runnable run = new Runnable(){ 
    @Override 
    public void run(){ 
     if(row>=0 && (dir==0 && (row==6 || grid[row+1][col]!=null)) || 
       (dir==1 && (col==6 || grid[row][col+1]!=null)) || 
       (dir==2 && (row==0 || grid[row-1][col]!=null)) || 
       (dir==3 && (col==0 || grid[row][col-1]!=null))) 
      dir++; 
     dir=dir%4; 
     switch(dir){ 
      case 0: row++;break; //down 
      case 1: col++;break; //right 
      case 2: row--;break; //up 
      case 3: col--;break; //left 
     } 
     grid[row][col] = new ImageView(t); 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(88, 88); 
     layoutParams.setMargins((width/2)-(450)+(88 * row) + (35 * (row + 1))+c, (height/2)-655+(88 * (col+1)) + (35 * (col + 1))+c ,0,0); 
     grid[row][col].setLayoutParams(layoutParams); 
     grid[row][col].setImageResource(R.drawable.redbox); 
     layout.addView(grid[row][col]); 
     x++; 
     c++; 
     c=c%7; 
     while(!stop && x<49) 
      h.postDelayed(run,500); 
    } 
}; 

public void spiral() { 
    c=0; 
    row=-1; 
    col=0; 
    dir =0; 
    run.run(); 
} 
+0

所以你的問題是...? – rupps 2014-12-06 01:57:20

+0

我怎樣才能使這實際上有500毫秒延遲動畫?它不起作用。使用計時器還是其他的更好? – Zach 2014-12-06 02:02:55

+0

刪除的同時,你正在調用函數無限次!將其更改爲:if((x <49)&&(!stop))h.postDelayed(run,500);' – rupps 2014-12-06 02:28:14

回答

1

有許多方法可以做到這一點,包括一些就像你在這裏所做的一樣。要做的第一件事是在Runnable末尾刪除while()循環,而只要計數小於49,就可以自己發佈Runnable。您現在擁有的每次運行時都會發布多次相同的Runnable ,全部觸發,同時交付給主Handler

+0

這很好用。謝謝! – Zach 2014-12-06 02:39:18