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

Android 动画只运行两次,然后停止工作?,android,android-animation,android-view,Android,Android Animation,Android View,我有一个显示一些控件的RelativeLayout,我想使用幻灯片向上/向下动画来隐藏和显示它们 这在第一次向下滑动和下一次向上滑动时都可以正常工作,但在那之后,它会因为没有明显的原因而停止工作 以下是执行动画的代码: final ViewGroup controlsLayout = (ViewGroup) findViewById(R.id.controlsLayout); final boolean show = controlsLayout.getTag() instanc

我有一个显示一些控件的
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
的值在每次运行时按预期进行切换。第一次运行代码时,控件会向下滑动。下次他们再滑上去的时候。但下一次(即使切换了show),动画甚至都不会启动

向下滑动.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>
<?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>

向上滑动.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>
<?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>

我认为问题在于将布局设置为
controlsLayout.setVisibility(View.GONE)时android在下一次运行时不会渲染您的布局,并且您正在尝试在尚未渲染的视图上设置动画,动画将在没有布局的视图上出现。动画完成后,它将对其进行渲染,突然视图将显示为没有动画

所以我建议你将可见性保持为不可见,而不是消失,如果你不能做到这一点,那么你应该先使其不可见,然后应用动画,然后在动画之后使其可见

另一种方法是在
xml
中简单地使用
android:animateLayoutChanges=“true”
作为默认动画,效果非常好


希望它能有所帮助

我认为问题在于当您将布局设置为
controlsLayout.setVisibility(View.GONE)时android在下一次运行时不会渲染您的布局,并且您正在尝试在尚未渲染的视图上设置动画,动画将在没有布局的视图上出现。动画完成后,它将对其进行渲染,突然视图将显示为没有动画

所以我建议你将可见性保持为不可见,而不是消失,如果你不能做到这一点,那么你应该先使其不可见,然后应用动画,然后在动画之后使其可见

另一种方法是在
xml
中简单地使用
android:animateLayoutChanges=“true”
作为默认动画,效果非常好


希望能有帮助好吧,这太愚蠢了。现在,与我在问题中发布的代码完全相同。问题似乎在于Android Studio 2.0中的“即时运行”功能。由于某些原因,当使用“Instant Run”将代码“上传”到我的手机上时,代码不起作用,但当我完全重新启动并重建应用程序时,代码就起作用了

无论如何,我在尝试使用
ObjectAnimator
查找工作解决方案时发现了一个替代解决方案

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

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

好吧,这太愚蠢了。现在,与我在问题中发布的代码完全相同。问题似乎在于Android Studio 2.0中的“即时运行”功能。由于某些原因,当使用“Instant Run”将代码“上传”到我的手机上时,代码不起作用,但当我完全重新启动并重建应用程序时,代码就起作用了

无论如何,我在尝试使用
ObjectAnimator
查找工作解决方案时发现了一个替代解决方案

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

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

不幸的是,我已经尝试了这两种选择<代码>不可见
给出的结果与<代码>消失
的结果相同,即在第三个动画上不会发生任何事情(视图保持不变-既不会设置动画,也不会消失)。如您所见,在开始动画之前,我将视图设置为可见。使用
animateLayoutChanges=“true”
效果很好,但我想要的是滑动动画,而不是褪色动画。不幸的是,我已经尝试了这两个选项<代码>不可见给出的结果与<代码>消失的结果相同,即在第三个动画上不会发生任何事情(视图保持不变-既不会设置动画,也不会消失)。如您所见,在开始动画之前,我将视图设置为可见。使用
animateLayoutChanges=“true”
效果很好,但我想要的是滑动动画,而不是褪色动画。