一般情况下,我正在尝试对int值数组进行动画处理,这与典型的情况不同,在这种情况下,您只是将int或float从一个数字设置为另一个数字。
具体来说,我试图在GradientDrawable对象上设置颜色的int []动画。
GradientDrawable有一个名为“setColors(int [])”的属性,其中我设置了2种颜色,即起始颜色和结束颜色,它们组成了一个完整的渐变。
我希望从一种颜色组合到另一种颜色的组合。如果它是纯色,我可以这样做,如下所示:
Integer colorFrom = getResources().getColor(R.color.red);
Integer colorTo = getResources().getColor(R.color.blue);
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
textView.setBackgroundColor((Integer)animator.getAnimatedValue());
}
});
colorAnimation.start();
所以,我需要这样的东西:
//Define 2 starting colors
Integer colorFrom1 = getResources().getColor(R.color.red);
Integer colorFrom2 = getResources().getColor(R.color.darkred);
int[] startColors = new int[] {colorFrom1, colorFrom2};
//Define 2 ending colors
Integer colorTo1 = getResources().getColor(R.color.blue);
Integer colorTo2 = getResources().getColor(R.color.darkblue);
int[] endColors = new int[] {colorTo1, colorTo2};
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), startColors, endColors);
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
gradientView.setColors((Integer)animator.getAnimatedValues()[0] , (Integer)animator.getAnimatedValues()[1]);
}
});
colorAnimation.start();
很明显,代码将不存在,因为没有getAnimatedValues()方法返回数组,而且没有ValueAnimator.ofObject方法接受数组作为起始值和结束值。
有什么想法吗?
我现在唯一的想法是并行运行两个动画师,每个动画制作渐变的一个维度,并且每个设置只有一半的数据被gradientDrawable.setColors()接受....但是boyyyy几乎是无法接受的低效率并且可能危险地不同步。
答案 0 :(得分:2)
这个怎么样?
public class ArgbArrayEvaluator implements TypeEvaluator<Integer[]> {
ArgbEvaluator evaluator = new ArgbEvaluator();
public Integer[] evaluate(float fraction, Integer[] startValues, Integer[] endValues) {
if(startValues.length != endValues.length) throw new ArrayIndexOutOfBoundsException();
Integer[] values = new Integer[startValues.length];
for(int = 0;i<startValues.length;i++) {
values[i] = (Integer) evaluator.evaluate(fraction,startValues[i],endValues[i]);
}
return values;
}
}
然后做
/* Make sure startColors and endColors are Integer[] not int[] */
final ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbArrayEvaluator(),startColors,endColors);
您的听众代码:
public void onAnimationUpdate(ValueAnimator animator) {
Integer[] values = (Integer[]) animator.getAnimatedValue();
gradientView.setColors(values[0],values[1]);
}
或者,使用ObjectAnimator
final ObjectAnimator colorAnimation = ObjectAnimator.ofMultiInt(gradientView,"colors",null, new ArgbArrayEvaluator(), startColors,endColors);
此外,在start()方法的ValueAnimator文档中,它说:
通过调用此方法启动的动画将在调用此方法的线程上运行。该线程应该有一个Looper(如果不是这样,将抛出运行时异常)。此外,如果动画将为视图层次结构中的对象的属性设置动画,则调用线程应该是该视图层次结构的UI线程。
如果你还没有进入UI线程,我会使用以下内容。
runOnUiThread(new Runnable() {
public void run() {
colorAnimation.start();
}
});
我认为它会起作用!