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,就行了。界面我也不貼了,就是一個小問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章