Android Canvas 从白色到红色的过渡
Android Canvas transition from white to red
我正在尝试将 canvas 从白色过渡到红色,但它似乎永远不会画到最后。所以你看不到过渡。我尝试了一些使用 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 并相应地设置油漆的 argb。 canvas get 被绘制并且 invalidate()
被调用。 Thread.sleep()
方法略有延迟 10。
我在 android canvas 中没有找到完成此操作的好方法,我认为这是我当前的实现。对于几秒钟的延迟,什么都没有,然后最后只有 argb(255,255,0,0)
的最终颜色。当它应该显示 argb(255,0,0,0)
- argb(255,255,0,0)
.
中的每种颜色时
像下面这样使用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();
我正在尝试将 canvas 从白色过渡到红色,但它似乎永远不会画到最后。所以你看不到过渡。我尝试了一些使用 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 并相应地设置油漆的 argb。 canvas get 被绘制并且 invalidate()
被调用。 Thread.sleep()
方法略有延迟 10。
我在 android canvas 中没有找到完成此操作的好方法,我认为这是我当前的实现。对于几秒钟的延迟,什么都没有,然后最后只有 argb(255,255,0,0)
的最终颜色。当它应该显示 argb(255,0,0,0)
- argb(255,255,0,0)
.
像下面这样使用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();