我在TextView上有两个TranslateAnimations,我希望它们一个接一个地执行。但是,通过使用下面的代码,只执行第二个代码。
我该如何解决这个问题?
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f);
animation.setDuration(200);
wave.startAnimation(animation);
TranslateAnimation animation1 = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f);
animation1.setDuration(200);
wave.startAnimation(animation1);
答案 0 :(得分:52)
将它们连接在一起 Animation Set
AnimationSet as = new AnimationSet(true)
TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, -150.0f);
animation.setDuration(200);
as.addAnimation(animation);
TranslateAnimation animation1 = new TranslateAnimation(
Animation.ABSOLUTE, 0.0f, Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, 150.0f, Animation.ABSOLUTE, 0.0f);
animation1.setDuration(200);
animation1.setStartOffset(200);
as.addAnimation(animation1);
wave.startAnimation(as);
答案 1 :(得分:32)
编辑:下面的Andy Boots答案是更好的答案imo。
设置你的第一个就像这样,一旦动画结束,它就会启动另一个:
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
wave.startAnimation(animation1);
}
});
编辑:仅使用当前代码执行第二个动画的原因是因为它会覆盖第一个动画的播放(实际上都播放了,但你只看到最新的动画开始)。如果你喜欢我写的,他们将按顺序而不是并行播放。
答案 2 :(得分:10)
您也可以使用android:startOffset
属性通过XML本身执行此操作,并且有一个问题:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="300"
android:fromXScale="0%"
android:fromYScale="0%"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="100%"
android:toYScale="100%" />
<alpha
android:duration="300"
android:fromAlpha="0"
android:toAlpha=".5" />
<alpha
android:duration="300"
android:fromAlpha=".5"
android:startOffset="300"
android:toAlpha="1" />
</set>
答案 3 :(得分:7)
还有一种方法可以实现这一目标,当您需要逐个动画大量视图时,这种方法非常有用。您可以使用setStartOffset
方法在动画开始前设置延迟。因此,如果您知道,第一个动画结束需要多长时间,您可以将其设置为第二个动画的延迟。这是一个示例,我一个接一个地动画六个ImageButtons
和六个TextViews
:
public void animateButtons() {
// An array of buttons
int[] imageButtonIds = {R.id.searchButton, R.id.favoriteButton, R.id.responseButton, R.id.articleButton, R.id.resumeButton, R.id.subscribeButton};
// Array of textViews
int[] textViewIds = {R.id.searchTextView, R.id.favoriteTextView, R.id.responseTextView, R.id.articleTextView, R.id.resumeTextView, R.id.subscribeTextView};
int i = 1;
for (int viewId : imageButtonIds) {
ImageButton imageButton = (ImageButton) findViewById(viewId);
// Animation from a file fade.xml in folder res/anim
Animation fadeAnimation = AnimationUtils.loadAnimation(this, R.anim.fade);
// Delay for each animation is 100 ms bigger than for previous one
fadeAnimation.setStartOffset(i * 100);
imageButton.startAnimation(fadeAnimation);
// The same animation is for textViews
int textViewId = textViewIds[i-1];
TextView textView = (TextView) findViewById(textViewId);
textView.startAnimation(fadeAnimation);
i ++;
}
}
在我的res/anim
文件夹中,我有一个名为fade.xml
的文件,其中包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<!-- Fade animation with 500 ms duration -->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="500" />
答案 4 :(得分:2)
创建动画数组并使用方法创建AnimationSet。
main.cs
方法:
Animation[] animations = {
getScaleAnimation(0.4f, 1.3f, 2000),
getScaleAnimation(1.3f, 1.0f, 500),
getScaleAnimation(0.4f, 1.3f, 1000),
getScaleAnimation(1.3f, 1.0f, 3000),
getScaleAnimation(0.4f, 1.3f, 500),
getScaleAnimation(1.3f, 1.0f, 1700),
getScaleAnimation(0.4f, 1.3f, 2100),
getScaleAnimation(1.3f, 1.0f, 3400)
};
AnimationSet animationSet = addAnimationAr(animations);
view.startAnimation(animationSet);
答案 5 :(得分:1)
如果您使用代码,可以致电
Animation.setStartOffset()
延迟第二个动画。
如果您使用xml,则可以android:ordering="sequentially"
属性使两个动画按顺序执行。
答案 6 :(得分:1)
animate()
和withEndAction()
函数来实现,就像这样: ImageView img = findViewById(R.id.imageView);
img.animate().rotation(180).alpha(0).setDuration(3000).withEndAction(new Runnable() {
@Override
public void run() {
ImageView img = findViewById(R.id.imageView);
img.animate().rotation(0).alpha(1).setDuration(2000);
}
});
答案 7 :(得分:0)
在Android中运行此类动画非常简单。实际上,Android API中有一个专门针对此特定任务的类称为AnimationDrwable。 AnimationDrawable是一组图像在一起。
第一步:创建AnimationDrwable
步骤2:将可绘制的动画加载到ImageView
第三步:开始动画
步骤1: 创建XML并添加所有类似的图像。
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/cat_image_1" android:duration="200" />
<item android:drawable="@drawable/cat_image_2" android:duration="200" />
<item android:drawable="@drawable/cat_image_3" android:duration="200" />
</animation-list>
第2步:
public void onCreate(Bundle savedInstanceState) {
//Step 2
ImageView myimage = (ImageView) findViewById(R.id.my_image);
myimage.setBackgroundResource(R.drawable.rocket_thrust);
//Step 3
AnimationDrawable catAnimation = (AnimationDrawable) rocketImage.getBackground();
catAnimation.start();
}