Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用单个ImageView显示在不同时间启动的不同AnimationDrawable,而不触发;错误线程异常?“;_Android_Animation - Fatal编程技术网

Android 如何使用单个ImageView显示在不同时间启动的不同AnimationDrawable,而不触发;错误线程异常?“;

Android 如何使用单个ImageView显示在不同时间启动的不同AnimationDrawable,而不触发;错误线程异常?“;,android,animation,Android,Animation,好的,我有一个游戏,我正在工作,我需要能够把不同的角色状态动画到一个单一的视图。这里有两个动画列表,一个显示处于平静状态的敌人,另一个显示敌人被击中。两者都是drawable文件夹中单独的.xml文件中的动画列表 AnimationDrawable enemy_neutral_animation, enemy_hit_animation; ImageView enemy, player; //...after onCreate() enemy = (ImageView)findViewById

好的,我有一个游戏,我正在工作,我需要能够把不同的角色状态动画到一个单一的视图。这里有两个动画列表,一个显示处于平静状态的敌人,另一个显示敌人被击中。两者都是drawable文件夹中单独的.xml文件中的动画列表

AnimationDrawable enemy_neutral_animation, enemy_hit_animation;
ImageView enemy, player;

//...after onCreate()
enemy = (ImageView)findViewById(R.id.ImageView2);
enemy.setBackgroundResource(R.drawable.goblin_neutral);
enemy_neutral_animation = (Animation)enemy.getBackground();
enemy_neutral.start();

//...now jump to the code that triggers a new animation
enemy.setBackgroundResource(R.drawable.goblin_hit);
enemy_hit_animation = (Animation)enemy.getBackground();
enemy_hit_animation.start();

// all of this works^^, as I can see the second animation displayed

// I use a timer to wait for the animation to finish
mTimer.schedule(timerTask, 600);

//mTask is where it stops everytime
timerTask = new TimerTask() {
        @Override
        public void run() {
            enemy.setBackgroundResource(R.drawable.goblin_anim_neutral);
            enemy_neutral = (AnimationDrawable)enemy.getBackground();
            enemy_neutral.start();

        }
    };
// I get a wrong thread exception
// E/AndroidRuntime: FATAL EXCEPTION: Timer-0                                               
ViewRootImpl$CalledFromWrongThreadException:    
ViewRootImpl$CalledFromErrorThreadException:

因为
敌方
ImageView对象是通过运行
TimerTask
TimerTask
在UI线程的单独线程上运行来访问的,但我们只能从UI线程更新或访问UI元素

要使其正常工作,请使用
runOnUiThread
从非ui线程访问视图。例如:

timerTask = new TimerTask() {
   @Override
    public void run() {
      runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // access enemy here
               enemy.setBackgroundResource(R.drawable.goblin_anim_neutral);
               ...
            }
         });
    }
};

我将采用的方法是使用处理程序和Runnable

在类中,创建一个处理程序成员变量,如下所示

Handler handler;
Runnable myRunnable = new Runnable() {
   @Override
   public void run() {
        enemy.setBackgroundResource(R.drawable.goblin_anim_neutral);
        enemy_neutral = (AnimationDrawable)enemy.getBackground();
        enemy_neutral.start();
   }
}
注意:您要按如下方式导入处理程序:

import android.os.Handler;
还要创建一个可运行的成员变量,如下所示

Handler handler;
Runnable myRunnable = new Runnable() {
   @Override
   public void run() {
        enemy.setBackgroundResource(R.drawable.goblin_anim_neutral);
        enemy_neutral = (AnimationDrawable)enemy.getBackground();
        enemy_neutral.start();
   }
}
在构造函数中,可以初始化处理程序

handler = new Handler();
因此,当您需要安排任务时,只需调用

handler.postDelayed(myRunnable, 600);

有一些方法可能很有用,因此您不必依赖
TimerTask