我正在开发一个 Android 应用程序,并且在我的主/启动器屏幕(您最初启动应用程序时进入的屏幕)上我想在背景中有一个简单的动画。具体来说,现在我在窗口中心有几个按钮,在背景中我有一些小星星在屏幕的左上角到右下角做一个循环平移动画,在其他所有东西的后面。它是非交互式的,一旦完成就会重复。我有九颗这样的星星,它们不是特别大。但是,当我尝试运行该应用程序时(这确实主要发生在模拟器上,但它也发生在我的手机上,只是不太常见)我收到如下消息:
I/Choreographer( 632): Skipped 33 frames! The application may be doing too much work on its main thread.
似乎它实际上在做的是试图排列我的星星,以便它们同时移动。当我开始动画时,我让它们以彼此偏移的方式运行,即一颗星星每 0.5 秒左右经过一次,但是当它跳过帧时,它会将它们排成一行,因此星星(从几个开始但最终以所有星星)在完全相同的时间开始和结束他们的动画。这看起来很傻,因为有大量恒星同时以相同的速度穿过背景。我猜让它们在同一确切时间移动对处理器来说比让它们在偏移处运行要少,这可能就是它这样做的原因。
我知道除了主线程之外我不能在任何东西上进行 UI 活动,但这似乎有点傻。我所做的只是在我的应用程序背景中制作一个简单的、重复的动画,这“工作量太大”。那么,有没有一种方法可以制作动画,从而减少工作量,让我的动画看起来像它应该的样子?我正在尝试编写一个简单的游戏,但如果它甚至无法以可重复的非交互式方式为一些对象设置动画,我无法想象它如何处理交互式游戏。但是我在安卓上玩过互动游戏,所以我一定是遗漏了一些东西。有人有任何提示吗?
PS这里是我用来做动画的代码。
动画代码:
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);