Dynamic height viewpager

后端 未结 6 1368
無奈伤痛
無奈伤痛 2020-11-27 13:06

I\'m trying to create a custom viewpager inside custom scroll viewthat dynamically wraps the current child\'s height.

package com.example.vihaan.dynamicviewp         


        
6条回答
  •  北荒
    北荒 (楼主)
    2020-11-27 13:45

    @abhishek's ans does what is required but the code below also adds animation during height change

    public class WrappingViewPager extends ViewPager {
    
        private Boolean mAnimStarted = false;
    
        public WrappingViewPager(Context context) {
            super(context);
        }
    
        public WrappingViewPager(Context context, AttributeSet attrs){
            super(context, attrs);
        }
    
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
            if(!mAnimStarted && null != getAdapter()) {
                int height = 0;
                View child = ((FragmentPagerAdapter) getAdapter()).getItem(getCurrentItem()).getView();
                if (child != null) {
                    child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                    height = child.getMeasuredHeight();
                    if (VersionUtils.isJellyBean() && height < getMinimumHeight()) {
                        height = getMinimumHeight();
                    }
                }
    
                // Not the best place to put this animation, but it works pretty good.
                int newHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
                if (getLayoutParams().height != 0 && heightMeasureSpec != newHeight) {
                        final int targetHeight = height;
                        final int currentHeight = getLayoutParams().height;
                        final int heightChange = targetHeight - currentHeight;
    
                        Animation a = new Animation() {
                            @Override
                            protected void applyTransformation(float interpolatedTime, Transformation t) {
                                if (interpolatedTime >= 1) {
                                    getLayoutParams().height = targetHeight;
                                } else {
                                    int stepHeight = (int) (heightChange * interpolatedTime);
                                    getLayoutParams().height = currentHeight + stepHeight;
                                }
                                requestLayout();
                            }
    
                            @Override
                            public boolean willChangeBounds() {
                                return true;
                            }
                        };
    
                        a.setAnimationListener(new Animation.AnimationListener() {
                            @Override
                            public void onAnimationStart(Animation animation) {
                                mAnimStarted = true;
                            }
    
                            @Override
                            public void onAnimationEnd(Animation animation) {
                                mAnimStarted = false;
                            }
    
                            @Override
                            public void onAnimationRepeat(Animation animation) {
                            }
                        });
    
                        a.setDuration(1000);
                        startAnimation(a);
                        mAnimStarted = true;
                } else {
                    heightMeasureSpec = newHeight;
                }
            }
    
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
    

提交回复
热议问题