对于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);
这样 我们就完成了 需要的效果,总体看下来发现,并不是很复杂,所以只要我们把思路摸清,实现起来就没什么难度了!!