以编程方式创建的翻译动画的持续时间和偏移量不正确

时间:2014-11-27 09:21:49

标签: android android-animation

以下是需要做的事情:

我有一个带3个按钮的顶栏。右边两个可以按下,没有什么是有趣的。左边的一个用其他三个按钮替换所有三个按钮。使用动画:中间和右侧(新的)按钮从左按钮的位置滑出到相应的位置,而旧按钮则淡出。左按钮在没有移动的情况下被替换:旧按钮淡出,新按钮淡入。

如何做到这一点:

final Animation fadeOut, fadeIn;
Animation fadeOutWithListener;
fadeIn = AnimationUtils.loadAnimation(this, R.anim.camera_top_bar_fade_in);
fadeOut = AnimationUtils.loadAnimation(this, R.anim.camera_top_bar_fade_out);
final TranslateAnimation slideAnim;

slideAnim = new TranslateAnimation(
    Animation.RELATIVE_TO_PARENT, -flashAutoBtn.getLeft(),
    Animation.RELATIVE_TO_SELF, 0,
    Animation.RELATIVE_TO_SELF, 0,
    Animation.RELATIVE_TO_SELF, 0);
slideAnim.setDuration(1000L);
slideAnim.setStartOffset(0);
fadeOutWithListener = AnimationUtils.loadAnimation(this, R.anim.camera_top_bar_fade_out);
fadeOutWithListener.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        flashAutoBtn.startAnimation(fadeIn);
        flashOnBtn.startAnimation(slideAnim);
        flashOffBtn.startAnimation(slideAnim);
    }
    @Override
    public void onAnimationEnd(Animation animation) {
        flashBtn.setVisibility(View.INVISIBLE);
        gridBtn.setVisibility(View.INVISIBLE);
        switchCameraSideBtn.setVisibility(View.INVISIBLE);
        flashAutoBtn.setVisibility(View.VISIBLE);
        flashOffBtn.setVisibility(View.VISIBLE);
        flashOnBtn.setVisibility(View.VISIBLE);
    }
    @Override
    public void onAnimationRepeat(Animation animation) { }
});

flashBtn.startAnimation(fadeOutWithListener);
gridBtn.startAnimation(fadeOut);
switchCameraSideBtn.startAnimation(fadeOut);

它是如何工作的: fadeIn / Out动画没问题 - 它们以xml定义,持续时间设置为1000,持续时间为1秒。没有偏移。

两个翻译动画工作不正确:首先,它们不会与fadeOutWithListener动画同时启动。相反,他们等待100或200毫秒然后快速(持续时间为100或200毫秒)闪烁他们的变换(坐标是正确的btw)并消失。完成fadeOutWithListener后 - 侦听器的onAnimationEnd激活,按钮变为可见。

这是最后的尝试 - 在没有监听器之前 - 只是连续调用startAnimation和setVisibility - 是相同的相同行为。

1 个答案:

答案 0 :(得分:2)

如果你同时将两个动画应用于同一个ui,我记得,将会执行最新的动画。

要同时制作多个动画,您需要使用AnimationSet

AnimationSet set = new AnimationSet(false);
set.addAnimation(fadeOut);
set.addAnimation(slideOut);
view.setAnimation(set);
set.start();