Birrel
Birrel

Reputation: 4834

Android, set button background color with animation?

I have a button that, when clicked, I would like to have the button appear to flash by switching back and forth between two background colors.

This answer uses AlphaAnimation to make a flashing button:

    final Animation animation = new AlphaAnimation(1, 0); // Change alpha from fully visible to invisible
    animation.setDuration(500); // duration - half a second
    animation.setInterpolator(new LinearInterpolator()); // do not alter animation rate
    animation.setRepeatCount(Animation.INFINITE); // Repeat animation infinitely
    animation.setRepeatMode(Animation.REVERSE); // Reverse animation at the end so the button will fade back in
    final Button btn = (Button) findViewById(R.id.your_btn);
    btn.startAnimation(animation);

But I couldn't get it to work with background color.

Android Studio will auto-complete the following:

animation = new Animation() {
    @Override
    public void setBackgroundColor(int bg) {
        super.setBackgroundColor(bg);
    }
};

But I tried applying it to the button (with bg = Color.parseColor("#ffff9434")), but no dice.

Thank you in advance.

EDIT

Also tried the following, but it is deprecated and didn't work (from here)

    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);

ETID 2

Got it working, see answer below

Upvotes: 5

Views: 6852

Answers (1)

Birrel
Birrel

Reputation: 4834

Got it working! Thanks to this post!

final AnimationDrawable drawable = new AnimationDrawable();
final Handler handler = new Handler();

drawable.addFrame(new ColorDrawable(Color.RED), 400);
drawable.addFrame(new ColorDrawable(Color.GREEN), 400);
drawable.setOneShot(false);

btn = (Button) view.findViewById(R.id.flashBtn);

btn.setBackgroundDrawable(drawable);
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        drawable.start();
    }
    }, 100);

Works like a charm!

Upvotes: 7

Related Questions