Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android objectAnimator animate backgroundColor of Layout

I have a problem. I want to animate the background color of a LinearLayout, using ObjectAnimator.
The problem is that it animates, but it does neither care about duration nor valueFrom and valueTo.

This is my xml file:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:propertyName="backgroundColor"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:valueFrom="#FF0000"
    android:valueTo="#000000" />

In Java I call like this:

ObjectAnimator objAnim = (ObjectAnimator)AnimatorInflater.loadAnimator(getActivity(), R.animator.animator_bkg);
objAnim.setTarget(view);
objAnim.start();

Note that when I animate the alpha of the layout, it works as expected.
Is this an Android bug (4.0.3 on Asus Transformer), or I miss something?

like image 868
XMight Avatar asked Jun 19 '12 08:06

XMight


2 Answers

I googled a bit. There is an answer. Try to use TransitionDrawable. http://developer.android.com/guide/topics/resources/drawable-resource.html#Transition

Also, there is a topic somewhere on stackoverflow.com dedicated to the same problem.

ADDED Code example:

    Button btn = (Button)this.findViewById(R.id.btn1);
    //Let's change background's color from blue to red.
    ColorDrawable[] color = {new ColorDrawable(Color.BLUE), new ColorDrawable(Color.RED)};
    TransitionDrawable trans = new TransitionDrawable(color);
    //This will work also on old devices. The latest API says you have to use setBackground instead.
    btn.setBackgroundDrawable(trans);
    trans.startTransition(5000);
like image 142
user1415536 Avatar answered Nov 03 '22 21:11

user1415536


It seems to be an old issue. I stumbled on this question while having a similar problem.

At the end it was just a bug in Android. The code is supposed to work, but the AnimatorInflater just blunders when setting the evaluator.

So setting the TypeEvaluator after the inflation again would do the trick.

    ObjectAnimator objAnim = (ObjectAnimator)AnimatorInflater.loadAnimator(getActivity(), R.animator.animator_bkg);
    objAnim.setTarget(view);
    objAnim.setEvaluator(new ArgbEvaluator());
    objAnim.start();

Set to new ArgbEvaluator() the animation works like intended.

like image 14
tynn Avatar answered Nov 03 '22 21:11

tynn