2014-08-27 108 views
0

好吧,到目前爲止,我一直在尋找一些方法來解決這個問題,我一直在這個像已經5天,所以我會嘗試解釋它儘可能最好我有這個應用程序工作正常的唯一我正在努力的是球的顏色變化。事情是我希望它每5秒改變一次,而不是等待不斷變化。例如,當應用程序打開應用程序中的球的顏色爲紅色5秒鐘,然後它變成藍色,等待另一個5秒鐘後再變爲另一種顏色。我試圖在代碼中找出OnDraw在不等待的情況下隨機更改顏色的情況?我真的很感謝任何幫助或建議,因爲我一直在這一段時間。Android延遲改變顏色?

  @protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
      ballBounds.set(ballX-ballRadius, ballY-ballRadius, ballX+ballRadius,ballY+ballRadius); 
      Handler handler = new Handler();   
      int rnd = (int)(Math.random() * 4); 
       switch(rnd){ 
    case 0:handler.postDelayed(new Runnable(){ 
     public void run(){ 
     paint.setColor(Color.BLUE); 
     } 
    }, 3000); 
     break; 
    case 1: handler.postDelayed(new Runnable(){ 
     public void run(){ 
     paint.setColor(Color.RED); 
     } 
    }, 3000); 
     break; 
    case 2: handler.postDelayed(new Runnable(){ 
     public void run(){ 
     paint.setColor(Color.GREEN); 
     } 
    }, 3000); 
     break; 
    case 3:handler.postDelayed(new Runnable(){ 
      public void run(){ 
      paint.setColor(Color.YELLOW); 
      } 
     }, 3000); 
     break; 
     } 
    canvas.drawOval(ballBounds, paint); 

update(); 

try{ 
    Thread.sleep(20); 
}catch(InterruptedException e){} 

invalidate(); 
} 
+0

我只是把它全部放在一個線程中,從一個更新到另一個線程獲取增量時間並將其添加到一個int中。每當int達到5秒或更多時,球會切換顏色,並從int中減去5秒。 – vedi0boy 2014-08-27 21:40:39

回答

0

在大多數情況下,OnDraw將被調用多次。它會在潛在的隨機時間間隔內執行,具體取決於代碼的設置方式。

所以你的第一次調用可能在時間= 0ms發生,你的第二次調用可能發生在100ms等等。因此,你可能會得到一個100ms的藍色,然後是紅色,直到下一個顏色改變發生。您需要重組您的處理程序,以便它們最有可能在抽取機制之外。

也許會使您的視圖在onDraw方法外的單個處理程序中無效。與此類似的東西會循環,並用不同的顏色不斷更新視圖。 警告,未測試,快速僞代碼

public MyViewConstructorOrSimilarClass() 
{ 
    Handler handler = new Handler(); 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() 
     { 
     int rnd = (int)(Math.random() * 4); 
     switch(rnd) 
     { 
      case 0: 
       globalpaint.setColor(Color.BLUE); 
       break; 
      case 1: 
       globalpaint.setColor(Color.RED); 
       break; 
      case 2: 
       globalpaint.setColor(Color.GREEN); 
       break; 
      case 3: 
       globalpaint.setColor(Color.YELLOW); 
       break; 
     } 
     invalidate();//requestLayout(); Depends on view. 
     handler.postDelayed(runnable, 3000); 
     } 
    }; 
} 

@protected void onDraw(Canvas canvas) 
{ 
    ballBounds.set(ballX-ballRadius, ballY-ballRadius, ballX+ballRadius,ballY+ballRadius); 
    canvas.drawOval(ballBounds, globalpaint); 
} 
+0

好吧我會給這個鏡頭只是,好奇你是什麼意思requestLayout,我只是擴展視圖? – ovniMode 2014-08-27 21:03:30

+0

你可以在[requestLayout](http://developer.android.com/reference/android/view/View.html#requestLayout())和[invalidate](http://developer.android。 COM /參考/機器人/視圖/ View.html#無效()) – 2014-08-28 12:36:05

1

你無法控制的onDraw多少次將被調用,它是由Android的決定吧。

相反,您可以運行一個單獨的線程,每5秒更改一次顏色的值,並讓onDraw使用此值。