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