我正在使用Android应用程序和我的主/启动器屏幕(您最初启动应用程序时所带的屏幕)我希望在后台有一个简单的动画。具体来说,现在我有一些按钮位于窗口中央,在背景中我有一些小星星在屏幕的左上角到右下角进行循环翻译动画,在其他所有内容之后。它是非交互式的,一旦完成就会重复。我有九颗这样的星星,它们并不是非常大。但是,当我尝试运行应用程序时(这确实发生在模拟器上,但它也发生在我的手机上,只是不那么频繁)我收到这样的消息:
I/Choreographer( 632): Skipped 33 frames! The application may be doing too much work on its main thread.
似乎它实际上正在做的是试图排列我的星星,以便它们同时移动。当我开始动画时,我让它们彼此偏移地运行,即每隔0.5秒左右就会出现一个星星,但是当它跳过帧时,它会将它们排成一行,所以星星(从少数几个开始,但最终以全部结束)星星)在同一时间开始和结束他们的动画。这看起来非常愚蠢,因为有大量的恒星同时以相同的速度穿过背景。我猜测让它们在相同的时间内完全移动对于处理器而言比在偏移处运行更少,这可能就是为什么它就是这样做的原因。
我知道除了主线程之外我不能对任何事情进行UI活动,但这看起来有点傻。我所做的只是在我的应用程序的背景中进行简单的重复动画,这是“太多的工作”。 那么,有没有办法做动画,这将导致更少的工作,所以我的动画实际上看起来应该是这样的?我正在尝试编写一个简单的游戏,但如果它可以甚至设法以可重复的,非交互的方式为一些物体制作动画,我无法想象它如何处理交互式游戏。但是我在Android上玩过互动游戏,所以我必须遗漏一些东西。有人有任何提示吗?
P.S。这是我用来制作动画的代码 动画代码:
public static Animation _runAnimation(Activity ctx, View target) {
Animation animation = AnimationUtils.loadAnimation(ctx, R.anim.slide_right);
animation.setFillAfter(true);
target.startAnimation(animation);
return animation;
}
动画布局:(slide_right.xml)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" >
<translate android:fromXDelta="-20%p" android:toXDelta="100%p" android:duration="2000" android:repeatCount="infinite" />
<translate android:fromYDelta="-20%p" android:toYDelta="100%p" android:duration="2000" android:repeatCount="infinite" />
<!--rotate android:pivotX="0" android:toDegrees="360" android:duration="2000" android:repeatCount="10000" /-->//this doesn't cause the stars to spin in place, it rotates them around a point.
</set>
实际通话:
public Activity _launcher = this; //the activity
public Handler handler = new Handler(); //a handler
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star1));
}
}, 10);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star2));
}
}, 700);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star3));
}
}, 1600);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star4));
}
}, 2500);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star5));
}
}, 3300);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star6));
}
}, 3700);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star7));
}
}, 4400);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star8));
}
}, 5300);
handler.postDelayed(new Runnable() {
public void run() {
_runAnimation(_launcher, findViewById(R.id.star9));
}
}, 5800);