前言
开发了个安卓APP,在自定义View中使用了一个ValueAnimator来实现数值动画,突然又想引入一个和数值动画同时的颜色渐变动画,但是觉得再定义一个使用ArgbEvaluator的ValueAnimator太冗余了,于是用了一个简单的方法实现两种颜色的渐变
1. 实现思路
渐变动画的实现不一定需要计算出两个颜色的中间值,可以先后在同一位置,分别用两种颜色(需要的渐变前后颜色)画同一个图形,然后不断改变画笔Paint的透明度(也就是Alpha通道值),使上层颜色慢慢从透明变成半透明,完成渐变
注:Alpha值越小越透明,0=全透明,255=不透明
2. 代码实现
首先在自定义view中引入变量记录当前ValueAnimator的值
private int animatorValue = 0;
然后初始化一个ValueAnimator
aValueAnimator = ValueAnimator.ofInt(1000);
aValueAnimator.setDuration(500);
aValueAnimator.setInterpolator(overshootInterpolator);//使用了overshootInterpolator插值器
aValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
animatorValue = (int) valueAnimator.getAnimatedValue();
//do something
postInvalidate();
}
});
然后在onDraw函数中加入以下内容
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//.........
mPaint.setAlpha(255);
setPaintColor(R.color.lightgray); //用第一种颜色画一遍
canvas.drawPath(Path,mPaint);
setPaintColor(R.color.whitesmoke); //用第二种颜色画一遍
mPaint.setAlpha(limitAlpha((int)((float)animatorValue/1000*255)));
//mPaint.setAlpha((int)((float)animatorValue/1000*255))
canvas.drawPath(Path,mPaint);
//.........
}
//防止Alpha值超过[0,255]而引起错误
private int limitAlpha(int value) {
return Math.max(0, Math.min(value, 255));
}
通过这样就可以实现两种颜色的渐变了
其中的limitAlpha是因为使用了overshootInterpolator插值器,使得输出的animatorValue值可能会超过1000,从而使Alpha设置时大于255,因此加了一个限制函数limitAlpha,如果使用默认的插值器则不存在此问题
注意,以上代码不能复制下来就运行,需要根据自己的需求补全