這個問題比較好玩,首先放上動畫改變控件長寬的方法,比較簡單,因爲得通過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,就行了。界面我也不貼了,就是一個小問題。