动画(偶尔)滞后
Animations are (occasionally) laggy
我有 4 个TextViews
。它们一开始都是不可见的,我将它们动画化到屏幕上(从底部滑入)。我启动了一个线程来对每个线程进行动画处理,彼此间隔 200 毫秒。问题是:我在启动 activity 后第一次为 TextView 设置动画时,它们滞后了。但是,如果我之后再次为它们设置动画,它们就不会了。偶尔它们会随机滞后,但这不是很频繁。我只是想知道是否有办法防止这种情况。我只在一个 phone 上测试过,所以可能是这样,但很奇怪它只发生在启动 activity.
后的第一个动画上
animatingGroup = 0;
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
while (animate) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
public void run() {
Animation slideInAnim = AnimationUtils
.loadAnimation(getApplicationContext(),
R.anim.slide_in_from_bottom);
switch (animatingGroup) {
case 1:
tv1.startAnimation(slideInAnim);
tv1.setVisibility(View.VISIBLE);
break;
case 2:
tv2.startAnimation(slideInAnim);
tv2.setVisibility(View.VISIBLE);
break;
case 3:
tv3.startAnimation(slideInAnim);
tv3.setVisibility(View.VISIBLE);
break;
case 4:
tv4.startAnimation(slideInAnim);
tv4.setVisibility(View.VISIBLE);
animate = false;
break;
}
animatingGroup++;
}
});
}
}
};
new Thread(runnable).start();
这是动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="800"
android:toYDelta="0%"
android:fromYDelta="100%p" />
</set>
不要创建你的 slideInAnim Insider 处理程序,它会像地狱一样耗尽资源,尝试创建一次......也许在 onCreate() 中
编辑:
在我看来,这是一种简洁明了的方法来实现您想要实现的目标:
将您的 Textview 放入数组中:
TextView[] textViews = new TextView[]{tv1,tv2,tv3,tv4};
制作一个处理动画 startOffset 的 for 循环:
int startOffset = 200;
for(int i=0; i < textViews.length(); i++){
animSlideIn.setStartOffset(startOffset);
textViews[i].setVisibility(View.Visible);
textViews[i].startAnimation(animSlideIn);
startOffset = startOffset + 200;
}
这样你就可以减少新的 Thread 和 Handler Runnable 内容,并节省大量代码。
我有 4 个TextViews
。它们一开始都是不可见的,我将它们动画化到屏幕上(从底部滑入)。我启动了一个线程来对每个线程进行动画处理,彼此间隔 200 毫秒。问题是:我在启动 activity 后第一次为 TextView 设置动画时,它们滞后了。但是,如果我之后再次为它们设置动画,它们就不会了。偶尔它们会随机滞后,但这不是很频繁。我只是想知道是否有办法防止这种情况。我只在一个 phone 上测试过,所以可能是这样,但很奇怪它只发生在启动 activity.
animatingGroup = 0;
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
while (animate) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
public void run() {
Animation slideInAnim = AnimationUtils
.loadAnimation(getApplicationContext(),
R.anim.slide_in_from_bottom);
switch (animatingGroup) {
case 1:
tv1.startAnimation(slideInAnim);
tv1.setVisibility(View.VISIBLE);
break;
case 2:
tv2.startAnimation(slideInAnim);
tv2.setVisibility(View.VISIBLE);
break;
case 3:
tv3.startAnimation(slideInAnim);
tv3.setVisibility(View.VISIBLE);
break;
case 4:
tv4.startAnimation(slideInAnim);
tv4.setVisibility(View.VISIBLE);
animate = false;
break;
}
animatingGroup++;
}
});
}
}
};
new Thread(runnable).start();
这是动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="800"
android:toYDelta="0%"
android:fromYDelta="100%p" />
</set>
不要创建你的 slideInAnim Insider 处理程序,它会像地狱一样耗尽资源,尝试创建一次......也许在 onCreate() 中
编辑: 在我看来,这是一种简洁明了的方法来实现您想要实现的目标:
将您的 Textview 放入数组中:
TextView[] textViews = new TextView[]{tv1,tv2,tv3,tv4};
制作一个处理动画 startOffset 的 for 循环:
int startOffset = 200;
for(int i=0; i < textViews.length(); i++){
animSlideIn.setStartOffset(startOffset);
textViews[i].setVisibility(View.Visible);
textViews[i].startAnimation(animSlideIn);
startOffset = startOffset + 200;
}
这样你就可以减少新的 Thread 和 Handler Runnable 内容,并节省大量代码。