我有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>
答案 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();