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.dip 2 px(25),0)ここでは,最終コントロールの高さが0であることが分かるが,ConstraintLayoutレイアウトでは,高さが0であることが高さを表し,その辺の規則の影響を受けている.CONTENTは、上下がコントロールに依存すると、ルールに従ってストレッチします.
LinearLayoutでは試していませんが、layoutが設定されていると推測できます.Weightプロパティでは、上記のanimIn()を使用してもこの問題が発生します.
 
解決策は、コントロールの親レイアウトがConstraintLayoutでないようにすればいいです.インタフェースも貼らないで、小さな問題です.