프로그래밍 언어/Android

Android : 애니메이션 확장 / 축소

Rateye 2021. 6. 15. 10:43
728x90
반응형
질문 : Android : 애니메이션 확장 / 축소

다음과 같은 수직 linearLayout이 있다고 가정 해 보겠습니다.

[v1]
[v2]

기본적으로 v1에는 visibily = GONE이 있습니다. 확장 애니메이션과 함께 v1을 표시하고 동시에 v2를 누르고 싶습니다.

나는 다음과 같이 시도했다.

Animation a = new Animation()
{
    int initialHeight;

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final int newHeight = (int)(initialHeight * interpolatedTime);
        v.getLayoutParams().height = newHeight;
        v.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        initialHeight = height;
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
};

하지만이 솔루션을 사용하면 애니메이션이 시작될 때 깜박입니다. 애니메이션이 적용되기 전에 v1이 전체 크기로 표시했기 때문이라고 생각합니다.

자바 스크립트를 사용하면 jQuery의 한 줄입니다! Android로이 작업을 수행하는 간단한 방법이 있습니까?

답변

이 질문이 인기를 얻었으므로 실제 솔루션을 게시합니다. 가장 큰 장점은 애니메이션을 적용하기 위해 확장 된 높이를 알 필요가 없으며 뷰가 확장되면 콘텐츠가 변경되면 높이가 조정된다는 것입니다. 그것은 나를 위해 잘 작동합니다.

public static void expand(final View v) {
    int matchParentMeasureSpec = View.MeasureSpec.makeMeasureSpec(((View) v.getParent()).getWidth(), View.MeasureSpec.EXACTLY);
    int wrapContentMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    v.measure(matchParentMeasureSpec, wrapContentMeasureSpec);
    final int targetHeight = v.getMeasuredHeight();

    // Older versions of android (pre API 21) cancel animations for views with a height of 0.
    v.getLayoutParams().height = 1;
    v.setVisibility(View.VISIBLE);
    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            v.getLayoutParams().height = interpolatedTime == 1
                    ? LayoutParams.WRAP_CONTENT
                    : (int)(targetHeight * interpolatedTime);
            v.requestLayout();
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // Expansion speed of 1dp/ms
    a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
}

public static void collapse(final View v) {
    final int initialHeight = v.getMeasuredHeight();

    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if(interpolatedTime == 1){
                v.setVisibility(View.GONE);
            }else{
                v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // Collapse speed of 1dp/ms
    a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
}

@Jefferson이 주석에서 언급했듯이 애니메이션의 지속 시간 (및 속도)을 변경하여 더 부드러운 애니메이션을 얻을 수 있습니다. 현재 1dp / ms의 속도로 설정되어 있습니다.

출처 : https://stackoverflow.com/questions/4946295/android-expand-collapse-animation
728x90
반응형