在android中使用animationSet()制作动画

在android中使用animationSet()制作动画,android,animation,2d,Android,Animation,2d,好的,问题出在这里 我的活动中有一个ImageView,下面是它在main.xml中的外观: <ImageView android:id="@+id/ic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" android:layout_gravity="center_horizontal"/> 您可以在代码处看到我想要的

好的,问题出在这里 我的活动中有一个ImageView,下面是它在main.xml中的外观:

<ImageView  
android:id="@+id/ic"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/icon"
android:layout_gravity="center_horizontal"/>
您可以在代码处看到我想要的X转换(-300100),然后是(100,0)

然而,图像并没有像它应该的那样移动,而是在100处停止,然后反弹


嗯…,你们知道哪里不对,或者我应该怎么做才能做到吗?

如果我没弄错的话,你们是在拍摄一系列动画

有趣的是,一旦启动动画集,所有添加的动画将同时运行,而不是按顺序运行;因此,需要为第一个动画之后的每个动画设置StartOffset(长偏移)

也许像这样的东西会有用

as = new AnimationSet(true);
as.setFillEnabled(true);
as.setInterpolator(new BounceInterpolator());

TranslateAnimation ta = new TranslateAnimation(-300, 100, 0, 0); 
ta.setDuration(2000);
as.addAnimation(ta);

TranslateAnimation ta2 = new TranslateAnimation(100, 0, 0, 0); 
ta2.setDuration(2000);
ta2.setStartOffset(2000); // allowing 2000 milliseconds for ta to finish
as.addAnimation(ta2);

在3.0及更高版本中,类似的操作非常简单。这里有两个链接,我用来完成类似的事情


我建议您使用ObjectAnimator。实施您的案例非常容易。您的动画可能如下所示:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(targetView, "translationX", -200f);
animator1.setRepeatCount(0);
animator1.setDuration(1000);

ObjectAnimator animator2 = ObjectAnimator.ofFloat(targetView, "translationX", 100f);
animator2.setRepeatCount(0);
animator2.setDuration(1000);

ObjectAnimator animator3 = ObjectAnimator.ofFloat(targetView, "translationX", 0f);
animator3.setRepeatCount(0);
animator3.setDuration(1000);

//sequencial animation
AnimatorSet set = new AnimatorSet();
set.play(animator1).before(animator2);
set.play(animator2).before(animator3);
set.start();
如果您不熟悉ObjectAnimator,可以查看以下android示例教程:


ObjectAnimator是处理动画的一个很好的选择,但是,如果我没有弄错的话,ObjectAnimator不会为您提供设置FillAfter或设置FillEnabled的功能,因为用户724861在其原始帖子中似乎正在使用它。
ObjectAnimator animator1 = ObjectAnimator.ofFloat(targetView, "translationX", -200f);
animator1.setRepeatCount(0);
animator1.setDuration(1000);

ObjectAnimator animator2 = ObjectAnimator.ofFloat(targetView, "translationX", 100f);
animator2.setRepeatCount(0);
animator2.setDuration(1000);

ObjectAnimator animator3 = ObjectAnimator.ofFloat(targetView, "translationX", 0f);
animator3.setRepeatCount(0);
animator3.setDuration(1000);

//sequencial animation
AnimatorSet set = new AnimatorSet();
set.play(animator1).before(animator2);
set.play(animator2).before(animator3);
set.start();