在Android

时间:2015-10-19 23:57:02

标签: android arrays animation

一般情况下,我正在尝试对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几乎是无法接受的低效率并且可能危险地不同步。

1 个答案:

答案 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();
    }
});

我认为它会起作用!