问题
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?
回答1:
I figured out the solution to this problem.
imageView.setImageDrawable(getResource().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.
回答2:
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);
}
}
回答3:
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.
回答4:
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.
回答5:
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 !
来源:https://stackoverflow.com/questions/27951712/android-animationdrawable-cast-error