安卓实现ValueAnimator动画过程中颜色渐变(无需再引入ArgbEvaluator)

本文介绍了如何在自定义View中避免冗余,通过调整Paint透明度实现颜色渐变,结合ValueAnimator控制数值动画,展示了利用Alpha通道实现两种颜色无缝过渡的技巧,适用于Android开发。
摘要由CSDN通过智能技术生成

前言

开发了个安卓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,如果使用默认的插值器则不存在此问题
注意,以上代码不能复制下来就运行,需要根据自己的需求补全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值