有这样一个场景:时间一个动画,使View从一个颜色缓慢过渡到另外一种颜色,代码如下:
static ObjectAnimator createArgbAnimator(View view, String propertyName, int startColor, int endColor) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return ObjectAnimator.ofObject(view, propertyName, new TypeEvaluator() { @Override public Object evaluate(float fraction, Object startValue, Object endValue) { int startInt = (Integer) startValue; // 共4个字节: 如 0x00000000; 8位的十六进制;32位2进制数; int startA = (startInt >> 24) & 0xff; // 右移等效于与操作; 0x int startR = (startInt >> 16) & 0xff; int startG = (startInt >> 8) & 0xff; int startB = startInt & 0xff; int endInt = (Integer) endValue; // &操作获取一个字节的数据; int endA = (endInt >> 24) & 0xff; int endR = (endInt >> 16) & 0xff; int endG = (endInt >> 8) & 0xff; int endB = endInt & 0xff; // 数据的拼接; return (startA + (int)(fraction * (endA - startA))) << 24 | (startR + (int)(fraction * (endR - startR))) << 16 | (startG + (int)(fraction * (endG - startG))) << 8 | (startB + (int)(fraction * (endB - startB))); } }, startColor, endColor); } else { return ObjectAnimator.ofArgb(view, propertyName, startColor, endColor); } }显然我们可以用ObjectAnimator不断改变View的backgroundColor属性来实现这个渐变效果。
ARGB中,每种色值占1个字节,共4个字节,32位;已知int类型的argb色值时,可以依次向右移动一定的位数来获取对应的色值,再与0xff做&操作,获取一个字节的数据,然后根据动画的速度对色值分别做适当的改变后,再做左移操作,然后用|进行拼接即可完成渐变的逻辑。