如何使用xml中定义的动画加载AnimatorSet

时间:2016-12-14 20:06:57

标签: android animation

我试图连续播放几个动画,一个接一个。这些动画将是简单的变换(移动图像视图一定距离)或更复杂的帧动画。

在研究这个问题时,AnimatorSet起初似乎是一个很好的解决方案。它允许您制作要播放的动画队列,然后按特定顺序执行它们。

    // defining an example animation
    Animator anim = ObjectAnimator.ofFloat(v, "alpha", 0f)
            .setDuration(100);
    AnimatorSet set = new AnimatorSet();

    // dictating the order in which the animations will be played
    set.playSequentially(anim, skewAnim, wobbleAnim);

    set.start();

问题在于,据我所知,你无法定义一个Animator对象来放置在xml文件中定义的动画中的AnimatorSet。

另外,AnimationSet(注意不同的名字)只允许你同时播放几个动画,所以这个类不能用于我的目的。

有人知道从项目中的xml对象定义Animator对象的方法吗?或者,是否还有另一种方法可以完全播放一系列动画?

更新:

    AnimatorSet set = new AnimatorSet();
    Animator anim1 = AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.sample);
    anim1.setTarget(myView1);
    Animator anim2 = AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.sample);
    anim2.setTarget(myView2);

    anim1.setDuration(3000);
    anim2.setDuration(3000);

    anim1.setInterpolator(new CycleInterpolator(5));
    anim2.setInterpolator(new CycleInterpolator(5));

    set.playSequentially(anim1,anim2);
    set.start();

1 个答案:

答案 0 :(得分:3)

要从xml将动画加载到AnimatorSet中,您的xml应包含AnimatorObjects而不是动画。然后你可以使用AnimatorInflater将这些animatorObjects加载到你的AnimatorSet中,如下所示:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getActivity(), R.animator.sample);

xml会喜欢这样的东西:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially"
    >

  <objectAnimator
      android:propertyName="alpha"
      android:duration="500"
      android:valueTo="1f"
      />
  <objectAnimator
    android:propertyName="y"
    android:duration="500"
    android:valueTo="300"
    android:valueType="intType"/>
</set>

有关AnimatorInflater

的更多详情,请参阅此链接

要在不同视图上播放顺序动画,您可以使用AnimationListeners。

anim1.addListener(new Animator.AnimatorListener() {
                            @Override
                            public void onAnimationStart(Animator animation) {

                            }

                            @Override
                            public void onAnimationEnd(Animator animation) {
                             // start anim2 from here
                            }

                            @Override
                            public void onAnimationCancel(Animator animation) {

                            }

                            @Override
                            public void onAnimationRepeat(Animator animation) {

                            }});