2017-05-03 95 views
0

嗨我試圖將畫布從白色過渡到紅色,但它似乎永遠不會畫到最後。所以你看不到轉變。我已經嘗試了幾個使用Timer和其他Java實用程序的選項,但是他們總是要求變量是最終的,這是不可能的。我相信使用線程睡眠是最好的方法,但我沒有得到所需的輸出。Android Canvas從白色過渡到紅色

for(int i=0; i < 255; i++){ 
    try { 
     Thread.sleep(10); 
     paint.setARGB(255,i,0,0); 
     canvas.drawPaint(paint); 
     invalidate(); 
    } catch(InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 
} 

正如您所看到的,for循環將循環遍歷0到255並相應地設置paint的argb。被畫的畫布和invalidate()被調用。 Thread.sleep()方法的延遲爲10。

我還沒有找到一個很好的方式來完成這個在Android畫布,我認爲這是我目前的實現。對於幾秒鐘的延遲沒有什麼,然後在最後只是argb(255,255,0,0)的最終顏色。當它應該顯示從argb(255,0,0,0) - argb(255,255,0,0)的每種顏色。

任何幫助,非常感謝。

回答

4

使用ValueAnimator此類似下面

class CustomView extends AnyView { 

    ... 

    public void setBackgroundColor(int color){ 
    paint.setColor(color); 
    invalidate(); 
    } 

    public void animateColorChange(int startColor, int endColor) { 
    ValueAnimator anim = ValueAnimator.ofInt(startColor, endColor); 
    anim.setEvaluator(new ArgbEvaluator()); 
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      final int newColor = (int) animator.getAnimatedValue(); 
      setBackgroundColor(newColor); 
     } }); 

    anim.start(); 
    } 

public void onDraw(Canvas canvas) { 
    canvas.drawPaint(paint); 
    } 
} 

或用ObjectAnimator

ObjectAnimator anim = ObjectAnimator.ofObject(paint, "color", new ArgbEvaluator(), startColor, endColor); 
anim.setDuration(1500); 
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
    invalidate(); 
    } 
}); 

anim.start(); 
+0

我想你更換ValueAnimator和它保持爲白色。 – L1ghtk3ira

+0

看看我更新的答案。不要在onDraw()方法中使用invalidate()。這個方法在你每次調用它時調用onDraw() –

+0

使用ValueAnimator,你可以動畫範圍內的int,就像你的情況一樣,但它會像動畫一樣。您可以從onAnimationUpdate方法 –