2017-05-03 1 views
0

Salut J'essaie de faire passer la toile du blanc au rouge, mais il semble ne jamais dessiner jusqu'à la fin. Donc vous ne pouvez pas voir la transition. J'ai essayé quelques options en utilisant Timer et d'autres utilitaires Java mais ils nécessitent toujours que les variables soient finales ce qui n'est pas possible. Je crois que l'utilisation du fil de sommeil est la meilleure approche, mais je n'obtiens pas la sortie désirée. Comme vous pouvez le voir, la boucle for passera de 0 à 255 et réglera l'argb de la peinture en conséquence. La toile est peinte et invalidate() est appelée. Il y a un léger retard de 10 pour la méthode Thread.sleep().Android Toile transition du blanc au rouge

Je n'ai pas trouvé un moyen agréable d'accomplir cela dans une toile Android et je pense que c'est mon implémentation actuelle. Pour le délai de quelques secondes il n'y a rien et puis à la fin seulement la couleur finale de argb(255,255,0,0). Quand il devrait montrer chaque couleur de argb(255,0,0,0) - argb(255,255,0,0).

Toute aide est grandement appréciée.

Répondre

4

Utilisez ValueAnimator pour cela comme ci-dessous

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); 
    } 
} 

Ou remplacer ValueAnimator avec 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

J'ai essayé le vôtre et il reste en blanc. – L1ghtk3ira

+0

Regardez ma réponse mise à jour. N'utilisez pas invalidate() dans la méthode onDraw(). Cette méthode appelle onDraw() chaque fois que vous l'appelez –

+0

Avec ValueAnimator vous pouvez animer range int, comme dans votre cas, mais ce sera comme une animation. Vous pouvez obtenir une valeur animée, 'i' dans votre cas, à partir de la méthode onAnimationUpdate –