Android animate drop down/up view proper

前端 未结 2 1902
滥情空心
滥情空心 2020-11-30 19:40

Okay I\'m trying to do a proper slide down animation. The view that slides down should push all views bellow it down in one smooth movement and again when it slides up all t

2条回答
  •  悲哀的现实
    2020-11-30 20:06

    Thank you Warpzit! That was a very helpful answer. In my case, I was only trying to animate views with height that was wrap_content. I tried triggs two-line suggestion, but it didn't work in my case. (I didn't spend much time pursuing why.) I ended up using a slightly modified form of Warpzit's ExpandCollapseAnimation with his static method to determine the height of the view

    In slightly more detail:

    1. I included his static method setHeightForWrapContent() in the ExpandCollapseAnimation class.
    2. I call the setHeightForWrapContent() in the ExpandCollapseAnimation constructor to properly determine the height of the view. To do this, I have to pass the activity in with the constructor.
    3. In the applyTransformation() method, when the view is finally reduced to zero height, I return the view's height back to wrap_content. If you don't do this, and change the content of the view later, when you expand it the view will expand to the height previously determined.

    The code is here:

    public class ExpandCollapseAnimation extends Animation {
        private View mAnimatedView;
        private int mEndHeight;
        private int mType;
    
        public ExpandCollapseAnimation(View view, int duration, int type, Activity activity) {
            setDuration(duration);
            mAnimatedView = view;
    
            setHeightForWrapContent(activity, view);
    
            mEndHeight = mAnimatedView.getLayoutParams().height;
    
            mType = type;
            if(mType == 0) {
                mAnimatedView.getLayoutParams().height = 0;
                mAnimatedView.setVisibility(View.VISIBLE);
            }
        }
    
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            if (interpolatedTime < 1.0f) {
                if(mType == 0) {
                    mAnimatedView.getLayoutParams().height = (int) (mEndHeight * interpolatedTime);
                } else {
                    mAnimatedView.getLayoutParams().height = mEndHeight - (int) (mEndHeight * interpolatedTime);
                }
                mAnimatedView.requestLayout();
            } else {
                if(mType == 0) {
                    mAnimatedView.getLayoutParams().height = mEndHeight;
                    mAnimatedView.requestLayout();
                } else {
                    mAnimatedView.getLayoutParams().height = 0;
                    mAnimatedView.setVisibility(View.GONE);
                    mAnimatedView.requestLayout();
                    mAnimatedView.getLayoutParams().height = LayoutParams.WRAP_CONTENT;     // Return to wrap
                }
            }
        }
    
        public static void setHeightForWrapContent(Activity activity, View view) {
            DisplayMetrics metrics = new DisplayMetrics();
            activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
            int screenWidth = metrics.widthPixels;
    
            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
            int widthMeasureSpec = MeasureSpec.makeMeasureSpec(screenWidth, MeasureSpec.EXACTLY);
    
            view.measure(widthMeasureSpec, heightMeasureSpec);
            int height = view.getMeasuredHeight();
            view.getLayoutParams().height = height;
        }
    }
    

    Thank you again, Warpzit!

提交回复
热议问题