Android:AnimationDrawable强制转换错误

时间:2015-01-14 20:20:43

标签: android animationdrawable

我正在关注Google提供的如何将DynamicDrawable与ImageView一起使用的示例。您可以在此处找到它:http://developer.android.com/guide/topics/graphics/drawable-animation.html

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

当我运行它时,我收到错误:

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

Google似乎认为这应该可行,但是如果你不能将BitmapDrawable强制转换为AnimationDrawable,我不确定它应该如何工作?

6 个答案:

答案 0 :(得分:9)

我找到了解决这个问题的方法。

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

我不知道为什么Google的文档会说使用背景,但使用setImageDrawable和getDrawable可以正常工作。老实说,无论如何,它会比其他方式更有效。

答案 1 :(得分:2)

我遇到了同样的问题。我知道这个帖子已经有一个月了,但是也许有人读了解我的经历。

我不知道为什么,但谷歌在将它用于动画时不会在他的Picturenames中接受像“_”这样的Spacemarks。我使用像“loading_frame1”这样的名字,但它不起作用。我将名称更改为“loadingframe1”,它可以工作....

在:

<?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>

后:

<?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>

这里是LoadingAnimation.class列表

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

答案 2 :(得分:1)

Google的代码有效。引导我到这里的“不能被投的问题”是因为我没有注意并将我的animation.xml放在res.anim而不是res.drawable。

但是我同意使用setImageDrawable并且getDrawable效果更好。

答案 3 :(得分:0)

关于这个问题,我对文档中google示例代码的细节稍作疏忽,对于使用该指南的几个人来说可能就是这种情况。

有一个单独的xml文件,用于保存drawable,指示转换并具有标记:

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

上面的文件名为rocket_thrust,它是同一个文件,在以下行中设置为backgroundDrawable:

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

试一试,确保文档没有错误。

祝你好运。

答案 4 :(得分:0)

完成动画制作的过程是: 1.使用imageView创建XML布局 和 2.为动画创建XML文件,假设为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>

现在 3.创建主要活动

然后输入此代码

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

*

  

注意:ImageView的背景为drawable,并给出了一个名称   animation.xml不是针对特定图像然后调用   AnimationDrawable中的imageview.getDrawable。   ----您无法在onCreate方法中运行动画。在onCreate()中的Imageview中设置drawable属性,但调用AnimationDrawable方法   onCreate()的块。

*

确定它会起作用!

答案 5 :(得分:0)

根据我的经验,只需为此页面添加更多答案,因为Stackoverflow似乎对此问题的答案非常有限

我的情况下,我试图为背景布局设置动画,使用可绘制的圆角半径。我收到logcat错误

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

结果是我必须将布局文件上的background属性设置为此可绘制文件

<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" />

然后在我的主要活动中调用此代码

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

我的错误是之前我将@drawable/rounded_corner放在布局文件中作为背景属性。 希望这对您有所帮助,因为我花了3个小时来解决这个问题。