关于ViewPager切换改变视图大小

对于ViewPager这个控件大家都是十分熟悉,前阵子接到了一个需求:要在viewPager滑动中改变视图大小,即可伸缩的ViewPager。起初拿到这个需求查了很多资料但都没有合适的解决办法,最后自己尝试很多方法终于实现,在这里简要与大家分享一下:

1.思路

viewpager的使用大家都不陌生,特点是为viewPager设置固定宽高不会有效果,所以对于这样的情况我们有两种解决方案,重写viewPager中的onMeasure()方法,动态的计算viewPager的高度,另一种是动态改变viewPager父控件的大小。很明显后一种方法简单明了好实现,思路清晰了那就上干货!

2.实现

首先要实现这个效果的关键有两点一是改变父控件的大小,二是**获取下一个视图的大小**;
//获取首次加载图片宽高bi并对viewPager父kongjian大小进行设置

                    RelativeLayout layout = (RelativeLayout) viewHolder.commonImgViewPager.getParent();
                    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) layout.getLayoutParams();
                    float weight = (float) (list.get(0).getH() * 1.0 / list.get(0).getW());//获取图片宽高比
                    lp.height = (int) (weight * CircleOutApplication.getInstance().getScreenWidth());//设置父控件高度
                    lp.width = getResources().getDisplayMetrics().widthPixels;//设置父控件宽
                    layout.setLayoutParams(lp);

通过上面代码我们实现动态的调整了 ViewPager 的大小,但并没有结束,我们要在滑动改变的话,还得在addOnPageChangeListener()这个事件中进行设置

@Override
                        public void onPageSelected(int position) {
                            if (position > list.size() || position == list.size()) {
                                return;
                            }
                            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) layout.getLayoutParams();
                            float weight = (float) (list.get(position).getH() * 1.0 / list.get(position).getW());
                            layoutParams.height = (int) (weight * CircleOutApplication.getInstance().getScreenWidth());
                            layout.setLayoutParams(layoutParams);
                        }

方法和上面一样,这样就可以在viewPager 滑动后改变大小了,但是写好了会发现这个改变是一闪而过,看着十分不舒服,所以 我们还得加上动画,让滑动改变的效果看起来流畅一些,

//如果需要的话 ,可以定义一个动画监听
   Animation.AnimationListener al = new Animation.AnimationListener() {
                @Override
                public void onAnimationEnd(Animation arg0) {
               //动画执行结束的操作
               //实际改变大小的代码可以放在这里
                }
                @Override public void onAnimationRepeat(Animation animation) {}
                @Override public void onAnimationStart(Animation animation) {}
            };
            //之后定义一个 动画简单的改变大小的动画
final int originHeight = height;//这是目标高
final int viewHeight  = vHeight;//控件高

            Animation animation = new Animation() {
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                //这里需要判断 原高和目标高的差,好正确的增加或者减少
                if(originHeight - viewHeight>0){
                        view.getLayoutParams().height = viewHeight + (int) ((originHeight-viewHeight) * interpolatedTime);
                    view.requestLayout()
                }else {
                            view.getLayoutParams().height = viewHeight - (int) ((viewHeight-originHeight) * interpolatedTime);
                    view.requestLayout()

                }

                @Override
                public boolean willChangeBounds() {
                    return true;
                }
            };
            if (al != null) {
                animation.setAnimationListener(al);
            }
            //设置动画时间
            animation.setDuration(300);
            //执行动画
            view.startAnimation(animation);

这样 我们就完成了 需要的效果,总体看下来发现,并不是很复杂,所以只要我们把思路摸清,实现起来就没什么难度了!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值