动画只运行两次,然后停止工作?

时间:2016-04-30 11:50:13

标签: android android-animation android-view

我有RelativeLayout显示一些控件,我想隐藏并使用上下滑动动画显示它们。

这对于第一次下滑和随后的下滑工作正常,但之后它没有明显的原因停止工作。

以下是执行动画的代码:

    final ViewGroup controlsLayout = (ViewGroup) findViewById(R.id.controlsLayout);
    final boolean show = controlsLayout.getTag() instanceof Boolean && controlsLayout.getTag().equals(Boolean.FALSE);

    Animation anim;
    if( show ) {
        anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_up);
        controlsLayout.setTag(Boolean.TRUE);
    }
    else{
        anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.slide_down);
        controlsLayout.setTag(Boolean.FALSE);
    }

    anim.setAnimationListener(new Animation.AnimationListener() {
        @Override public void onAnimationStart(Animation animation) {}
        @Override public void onAnimationRepeat(Animation animation) {}

        @Override
        public void onAnimationEnd(Animation animation) {
            // If we slided down, then hide the controls after the slide is done
            if( !show )
                controlsLayout.setVisibility(View.GONE);
        }
    });

    // Before starting the animation, we make sure the view is visible
    controlsLayout.setVisibility(View.VISIBLE);

    controlsLayout.startAnimation(anim);

变量show的值在每次运行时按预期切换。第一次运行代码时,控件会向下滑动。下次他们滑下来。但是下一次(即使节目被切换),动画甚至都没有开始......

slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromYDelta="0"
        android:toYDelta="100%" />
</set>

slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromYDelta="100%"
        android:toYDelta="0" />
</set>

2 个答案:

答案 0 :(得分:0)

我认为问题是当你将布局设置为controlsLayout.setVisibility(View.GONE); android没有在下次运行时渲染你的布局时,你试图在尚未渲染的视图上设置动画,动画将在没有布局的视图。动画完成后,它将渲染它并突然显示视图而不显示动画。

所以我建议你保持对INVISIBLE的可见性而不是GONE,如果你不能这样做那么你应该首先使它不可见,然后应用动画然后在动画之后让它可见。

另一种方法是在android:animateLayoutChanges="true"中使用xml作为默认动画,非常好。

希望有所帮助

答案 1 :(得分:0)

好吧,这是愚蠢的。现在我在我的问题中发布的完全相同的代码工作。问题似乎是Android Studio 2.0中的“即时运行”功能。出于某种原因,当使用“即时运行”将代码“上传”到我的手机时,代码无法正常工作,但当我完全重新启动并重建应用程序时,它可以正常工作。

无论如何,这是我在尝试使用ObjectAnimator找到有效解决方案时找到的替代解决方案。

    final ViewGroup controlsLayout = (ViewGroup) findViewById(R.id.controlsLayout);

    ObjectAnimator.ofFloat(
            controlsLayout,
            "translationY",
            controlsLayout.getTranslationY(),
            (controlsLayout.getTranslationY() > 0) ? 0 : controlsLayout.getHeight()
    ).start();