11

I was following the Google provided example of how to use AnimationDrawable with an ImageView. You can find it here: http://developer.android.com/guide/topics/graphics/drawable-animation.html

imageView.setBackgroundResource(R.drawable.animation);
AnimationDrawable animation = (AnimationDrawable)imageView.getBackground();
animation.start();

When I run it I get the error:

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable cannot be cast to android.graphics.drawable.AnimationDrawable

Google seems to think this should work, but if you cannot cast a BitmapDrawable to AnimationDrawable I am not sure how this is supposed to work?

TheOneX
  • 201
  • 1
  • 2
  • 7
  • Post source for animation.xml. – alanv Jan 15 '15 at 00:37
  • That is not the problem. The problem is with Google's code. You can't cast a BitmapDrawable to an AnimationDrawable. – TheOneX Jan 15 '15 at 18:52
  • If animation.xml defines an AnimationDrawable, this should work. View.getBackground() just returns the drawable that was loaded from the background XML resource. The documentation is correct. There may be another issue. – alanv Jan 15 '15 at 22:04

6 Answers6

9

I figured out the solution to this problem.

imageView.setImageDrawable(getResources().getDrawable(R.drawable.animation));
AnimationDrawable animation = (AnimationDrawable) imageView.getDrawable();
animation.start();

I have no idea why Google's documentation says to use the background, but using setImageDrawable and getDrawable works. Honestly it makes more sense it would work this way than the other way anyways.

Falke Design
  • 10,635
  • 3
  • 15
  • 30
TheOneX
  • 201
  • 1
  • 2
  • 7
4

I had the same problem. I know this thread is some month old, but maybe somebody what to read about my experience.

I dont know why, but google doesnt accept Spacemarks like "_" in his Picturenames while using it for animation. I uses names like "loading_frame1", and it doesnt work. I changed the names to something like "loadingframe1" and it works....

Before:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">

    <item android:drawable="@drawable/loading_frame1" android:duration="100" />
    <item android:drawable="@drawable/loading_frame2" android:duration="100" />
    <item android:drawable="@drawable/loading_frame3" android:duration="100" />
    <item android:drawable="@drawable/loading_frame4" android:duration="100" />
    <item android:drawable="@drawable/loading_frame5" android:duration="100" />
    <item android:drawable="@drawable/loading_frame6" android:duration="100" />
    <item android:drawable="@drawable/loading_frame7" android:duration="100" />
    <item android:drawable="@drawable/loading_frame8" android:duration="100" />
    <item android:drawable="@drawable/loading_frame9" android:duration="100" />
    <item android:drawable="@drawable/loading_frame10" android:duration="100" />
    <item android:drawable="@drawable/loading_frame11" android:duration="100" />
    <item android:drawable="@drawable/loading_frame12" android:duration="100" />
    <item android:drawable="@drawable/loading_frame13" android:duration="100" />
    <item android:drawable="@drawable/loading_frame14" android:duration="100" />
    <item android:drawable="@drawable/loading_frame15" android:duration="100" />
    <item android:drawable="@drawable/loading_frame16" android:duration="100" />
    <item android:drawable="@drawable/loading_frame17" android:duration="100" />
    <item android:drawable="@drawable/loading_frame18" android:duration="100" />
    <item android:drawable="@drawable/loading_frame19" android:duration="100" />
    <item android:drawable="@drawable/loading_frame20" android:duration="100" />

</animation-list>

After:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">

    <item android:drawable="@drawable/loadingframe1" android:duration="100" />
    <item android:drawable="@drawable/loadingframe2" android:duration="100" />
    <item android:drawable="@drawable/loadingframe3" android:duration="100" />
    <item android:drawable="@drawable/loadingframe4" android:duration="100" />
    <item android:drawable="@drawable/loadingframe5" android:duration="100" />
    <item android:drawable="@drawable/loadingframe6" android:duration="100" />
    <item android:drawable="@drawable/loadingframe7" android:duration="100" />
    <item android:drawable="@drawable/loadingframe8" android:duration="100" />
    <item android:drawable="@drawable/loadingframe9" android:duration="100" />
    <item android:drawable="@drawable/loadingframe10" android:duration="100" />
    <item android:drawable="@drawable/loadingframe11" android:duration="100" />
    <item android:drawable="@drawable/loadingframe12" android:duration="100" />
    <item android:drawable="@drawable/loadingframe13" android:duration="100" />
    <item android:drawable="@drawable/loadingframe14" android:duration="100" />
    <item android:drawable="@drawable/loadingframe15" android:duration="100" />
    <item android:drawable="@drawable/loadingframe16" android:duration="100" />
    <item android:drawable="@drawable/loadingframe17" android:duration="100" />
    <item android:drawable="@drawable/loadingframe18" android:duration="100" />
    <item android:drawable="@drawable/loadingframe19" android:duration="100" />
    <item android:drawable="@drawable/loadingframe20" android:duration="100" />

</animation-list>

And here the LoadingAnimation.class Listing

package com.justkidding.animation;

import android.support.v7.app.ActionBarActivity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;

public class LoadingAnimation extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading_animation);    
    }

    @Override
    public void onWindowFocusChanged (boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        ImageView animation = (ImageView)findViewById(R.id.aniimage);
        animation.setBackgroundResource(R.drawable.loading_animation);
        AnimationDrawable frameAnimation = (AnimationDrawable) animation.getBackground();
        if(hasFocus) {
            frameAnimation.start();
        } else {
            frameAnimation.stop();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.loading_animation, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
Justl24
  • 119
  • 1
  • 7
2

Google's code works. The "can not be cast issue" which lead me here, was because I was not paying attention and put my animation.xml in res.anim instead of res.drawable.

However I agree using setImageDrawable and getDrawable works better.

user1010160
  • 445
  • 3
  • 9
1

About this problem, I had a little oversight on the detail on google's example code in the documentation and this might be the case for a couple of persons using the guide.

There is an separate xml file that holds the drawables, indicating the transitions and has the tag:

<animation-list 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />>
</animation-list>

The above file is named rocket_thrust, and it is this same file that is set as backgroundDrawable in the following lines:

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

Give a try at this and be sure that documentation has no errors.

Best of luck.

Thadeus Ajayi
  • 993
  • 10
  • 16
0

Complete process to do animation is : 1. Create XML layout with imageView and 2. Create XML file for animation suppose drawable/animation.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/twit" android:duration="120"></item>
<item android:duration="120" android:drawable="@drawable/a111"></item>
<item android:duration="120" android:drawable="@drawable/a2"></item>
<item android:duration="120" android:drawable="@drawable/a3"></item>
<item android:duration="120" android:drawable="@drawable/a4"></item>
<item android:duration="120" android:drawable="@drawable/a5"></item>
<item android:duration="120" android:drawable="@drawable/a6"></item>

</animation-list>

now 3. Create Main Activity

Then Type this code

public class AnimationMe extends AppCompatActivity {
    private ImageView imgView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logoo);
        imgView = (ImageView) findViewById(R.id.imgView);

        // the frame-by-frame animation defined as a xml file within the drawable folder
        /*imgView.setBackgroundResource(R.drawable.animation);*/
        imgView.setImageDrawable(getResources().getDrawable(R.drawable.animation));

     // It's not possible to start the animation during the onCreate.
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        AnimationDrawable animationDrawable = (AnimationDrawable)imgView.getDrawable();
        if(hasFocus)
        {
            animationDrawable.start();
        }
        else
        {
            animationDrawable.stop();
        }
    }
}

*

Note : ImageView have background as drawable and give a name of animation.xml not for a particular image and then call with imageview.getDrawable in AnimationDrawable. ---- You can't Run Animation in onCreate Method. Set drawable property in Imageview in onCreate() but call AnimationDrawable method out of block of onCreate().

*

Sure it will work !

Pradeep Sheoran
  • 493
  • 6
  • 15
0

Just to add more answer to this page based on my experience because Stackoverflow seems has a very limited answer for this issue

I my case I tried to animate my background layout which using drawable for rounded radius. I got logcat error

java.lang.ClassCastException: android.graphics.drawable.GradientDrawable cannot be cast to android.graphics.drawable.AnimationDrawable

Turn out I must set the background attribute on my layout file to this drawable file

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
<item android:drawable="@drawable/rounded_corner" android:duration="80" />
<item android:drawable="@drawable/rounded_corner_gray_background" android:duration="80" />
<item android:drawable="@drawable/rounded_corner" android:duration="80" />
<item android:drawable="@drawable/rounded_corner_gray_background" android:duration="80" />
<item android:drawable="@drawable/rounded_corner" android:duration="80" />
<item android:drawable="@drawable/rounded_corner_gray_background" android:duration="80" />
<item android:drawable="@drawable/rounded_corner" android:duration="80" />

And then call this code on my Main Activity

val backgroundAnim = info_layout?.background as AnimationDrawable
                backgroundAnim.start()

My mistake is previously I put @drawable/rounded_corner on layout file as background attribute. Hope this can help somebody, as I spend 3 hours just to solve this issue.