Android:通过ValueAnimator动画改变控件长宽失效的问题解决

这个问题比较好玩,首先放上动画改变控件长宽的方法,比较简单,因为得通过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,就行了。界面我也不贴了,就是一个小问题。

你可能感兴趣的:(Android,android,安卓动画)