这个问题比较好玩,首先放上动画改变控件长宽的方法,比较简单,因为得通过LayoutParams设置宽高,所以说不能使用ObjectAnimator。
private void animOut() {
ValueAnimator animator = ValueAnimator.ofInt(0, ScreenUtil.dip2px(25));
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
ViewGroup.LayoutParams params = getLayoutParams();
params.height = (int) animation.getAnimatedValue();
setLayoutParams(params);
}
});
animator.setDuration(400);
animator.start();
}
private void animIn() {
ValueAnimator animator = ValueAnimator.ofInt(ScreenUtil.dip2px(25), 0);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
ViewGroup.LayoutParams params = getLayoutParams();
params.height = (int) animation.getAnimatedValue();
setLayoutParams(params);
}
});
animator.setDuration(400);
animator.start();
}
因为我是直接重写TextView,所以就没有tvXx.getLayoutParams了。
然后需要显示的话animOut() ;隐藏的话animIn()
先确定一件事,上面的代码是正确的,可以使用的。当然假如你控件开始的时候是Gone就得先设置成VISIBLE。
失效的话,是隐藏的问题,它动画也会先进行,只是最后结果,却是本来高度为0的控件,变成WRAP_CONTENT,或者被拉伸,依旧显示在界面上。
碰到这种情况,比较偶然,当它的父布局是ConstraintLayout的时候就会最终控件无法隐藏。看到这里,有没有恍然大悟的。
问题就出现在 ValueAnimator.ofInt(ScreenUtil.dip2px(25), 0) 这里,可以看出,最终控件的高度是0,在ConstraintLayout布局中,高度是0代表着有高度,受到它边规则的影响,假如说他只有上面依赖于另一个控件,那他就是WRAP_CONTENT,假如上下都依赖了控件,他就会根据规则拉伸。
虽然没在LinearLayout里尝试,可以猜测,当设置了layout_weight属性,使用上面的animIn()也会出现这种问题。
解决办法,让该控件父布局不是ConstraintLayout,就行了。界面我也不贴了,就是一个小问题。