Android LayoutAnimationController:如何强制第一个孩子在重复之前等待最后一个孩子的动画完成?

时间:2012-06-28 17:29:19

标签: android android-animation

我正在尝试使用此图片构建动画:

No bars

成为这张图片:

Bars

三个酒吧像1 ... 2 ...... 3一样淡出...然后回到没有。此时动画将重复。这是我试图做的工作:

    AlphaAnimation anim = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.fade_in);
    anim.setRepeatMode(Animation.RESTART);
    anim.setRepeatCount(Animation.INFINITE);
    anim.setStartOffset(3000);

    LayoutAnimationController controller = new LayoutAnimationController(anim, 0.5f);

    rl.setLayoutAnimation(controller);

    rl.startLayoutAnimation();

这个几乎有效,但问题是这些wifi栏的视图组中的第一个子节点不会等到最后一个子节点在它关闭之前完成动画。结果是一个看起来像1 ... 2 ... 3..1..2.3 ...... 1 ... 3 ... 1..2.3的节拍,而不是一个漂亮的1..2..3。 .1..2..3。我需要找到一种方法让控制器等到循环完成后再将第一个孩子关闭。我还没有找到任何解决方案,有没有人有一些意见?我愿意改变我这样做的方式,这个LayoutAnimationController类似乎是最好的方法,直到这一点。

谢谢!

1 个答案:

答案 0 :(得分:2)

当我不得不为图像使用动画时,我准备了帧。我在这个类中使用了AnimatioDrawable:

* This class is a hack to simply get an on finish callback for an
* AnimationDrawable.
*
*/
public class CustomAnimationDrawable extends AnimationDrawable {
// We need to keep our own frame count because mCurFrame in AnimationDrawable is private
private int mCurFrameHack = -1;

// This is the Runnable that we will call when the animation finishes
private Runnable mCallback = null;

/*
* We override the run method in order to increment the frame count the same
* way the AnimationDrawable class does. Also, when we are on the last frame we
* schedule our callback to be called after the duration of the last frame.
*/
@Override
public void run() {
super.run();

mCurFrameHack += 1;
if (mCurFrameHack == (getNumberOfFrames() - 1) && mCallback != null) {
scheduleSelf(mCallback, SystemClock.uptimeMillis() + getDuration(mCurFrameHack));
}
}

/*
* We override this method simply to reset the frame count just as is done in
* AnimationDrawable.
*/
@Override
public void unscheduleSelf(Runnable what) {
// TODO Auto-generated method stub
super.unscheduleSelf(what);
mCurFrameHack = -1;
}

public void setOnFinishCallback(Runnable callback) {
mCallback = callback;
}

public Runnable getOnFinishCallback() {
return mCallback;
}

}

在我的代码中,我使用它:

        CustomAnimationDrawable staticAnimation = new CustomAnimationDrawable();
    //add frames with resources and duration. step is just a class of mine
        staticAnimation.addFrame(getResources().getDrawable(step.getStepImageResId()), step.getStepDuration());
    staticAnimation.addFrame(getResources().getDrawable(step.getStepImageResId()), step.getStepDuration());
    staticAnimation.addFrame(getResources().getDrawable(step.getStepImageResId()), step.getStepDuration());
        staticAnimation.setOneShot(false);

        imgView.setBackgroundDrawable(staticAnimation);
staticAnimation.start();

可能不是最好的解决方案,但它能满足我的需求。