Android Canvas从白色过渡到红色

时间:2017-05-03 19:03:49

标签: java android timer android-canvas thread-sleep

我试图将画布从白色转换为红色但是它似乎永远不会画到最后。所以你看不到过渡。我已经尝试了一些使用Timer和其他Java实用程序的选项,但是它们总是要求变量是最终的,这是不可能的。我相信使用线程睡眠是最好的方法,但我没有得到所需的输出。

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)的每种颜色。

1 个答案:

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

或将ValueAnimator替换为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();