Android:通过ValueAnimator动画改变控件长宽失效的问题解决
16lz
2021-01-23
这个问题比较好玩,首先放上动画改变控件长宽的方法,比较简单,因为得通过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,就行了。界面我也不贴了,就是一个小问题。
更多相关文章
- 【5年Android从零复盘系列之五】关于页面布局控件开发总结
- 三个博客和一张关系图,掌握Android WebView控件
- Android 控件大全
- Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入
- ReactNative调用原生封装的代码和控件
- LinearLayout布局之weight
- Android 布局之LinearLayout
- Android——新手指引 指定View高光显示自定义控件
- Android基本控件 EditText