在Android中旋转动画序列

时间:2016-08-15 11:52:03

标签: android animation rotation android-animation rotateanimation

我想在Android项目中制作简单的动画。我的活动中有一张图片:

public void onStartButtonClick(View view){
    AnimationSet animationSet = new AnimationSet(true);
    animationSet.setInterpolator(new LinearInterpolator());
    animationSet.setFillAfter(true);

    RotateAnimation anim = new RotateAnimation(0.0f, -45.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    anim.setDuration(4000);
    animationSet.addAnimation(anim);

    RotateAnimation anim2 = new RotateAnimation(0.0f, 90.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    anim2.setDuration(4000);
    animationSet.addAnimation(anim2);

    RotateAnimation anim3 = new RotateAnimation(0.0f, -135.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    anim3.setDuration(4000);
    animationSet.addAnimation(anim3);

    RotateAnimation anim4 = new RotateAnimation(0.0f, 180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    anim4.setDuration(4000);
    animationSet.addAnimation(anim4);

    final ImageView pointer = (ImageView) findViewById(R.id.pointer_png);
    pointer.startAnimation(animationSet);
}

这是我在活动类中的onClick方法:

{{1}}

不幸的是,效果出乎意料。我想按照这个顺序旋转图像:

  1. 在4秒内旋转180度。
  2. 在接下来的4秒内旋转-135度。
  3. 在接下来的4秒内旋转90度。
  4. 在最后4秒内旋转-45度。
  5. 但是这个代码动画肯定短于16秒,它只由一部分组成 - 从0点开始90度,结束了。可能AnimationSet会检查所有动画并计算序列中的最后位置。我试图设置AnimationSet(false)并为每个RotateAnimation添加单独的LinearInterpolator,但它不起作用。

    我应该怎么做才能让我的动画更长,所有轮换分开(4步,每步4秒)?

1 个答案:

答案 0 :(得分:0)

根据我的经验,AnimationSet并不总是按预期工作,并且可能是a **的痛苦。我会尝试使用ViewPropertyAnimator

以下是如何使用它的示例。您可以像这样设置startDelay:

pointer.animate()
    .rotation(...)   // <- enter rotation values here
    .setStartDelay(4000)
    .setInterpolator(new LinearInterpolator())
    .setDuration(4000);

或设置AnimationListener并在前一个动画完成时开始onAnimationEnd()中的下一个动画。

自发地,如果我必须这样做,我会编写自己的方法,就像这样(未经测试):

private void rotate(View v, float rotation, int startDelay) {
    v.animate()
     .rotation(rotation)  // or rotationBy(rotation) whichever suits you better
     .setStartDelay(startDelay)
     .setInterpolator(new LinearInterpolator())
     .setDuration(4000);
}

然后像这样调用它四次:

rotate(pointer, -45, 0);
rotate(pointer, 90, 4000);
rotate(pointer, -135, 8000);
rotate(pointer, 180, 12000);