Viewpager显示上一页的一部分和下一页的一部分(循环滑动)

实现一个用viewpager显示上一页和下一页一部分,而且能够不断循环的功能,我们只需要下面几步

1、在很多时候我们使用ViewPager的时候,往往都需要viewpager自适应高度,但是会发现wrap_content会不起作用,这时候就需要自定义一个自适应高度的ViewPager。自定义viewpager的核心代码

 @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
   
        int height = 0;  
        for (int i = 0; i < getChildCount(); i++) {  
            View child = getChildAt(i);  
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
            int h = child.getMeasuredHeight();  
            if (h > height)  
                height = h;  
        }  
   
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);  
   
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    }  


2、布局文件

<LinearLayout
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:background="@color/member_bg"
			android:id="@+id/ll_container"
			android:clipChildren="false">


			<WrapContentHeightViewPager
				android:id="@+id/vp_member"
				android:layout_width="match_parent"
				android:layout_height="wrap_content"
				android:layout_marginRight="30dp"
				android:layout_marginLeft="30dp"
				android:layout_gravity="center_horizontal"
				android:clipChildren="false"/>


		</LinearLayout>

3、java文件

private void init() {
		mWidth = mScreenWidth - DisplayUtil.dip2px(this, 100);
		itemHeight = (mScreenWidth - DisplayUtil.dip2px(this, 60)) / 2;
		mHeight = mWidth / 1.78f;
		for (View view : itemViews) {
			view.getLayoutParams().height = (int) itemHeight;
			view.getLayoutParams().width = (int) itemHeight;
		}

		for (int i = 0; i < memberLevelIcons.length; i++) {
			ImageView ivMember = new ImageView(this);
			ViewGroup.LayoutParams lp = ivMember.getLayoutParams();
			if (lp == null) {
				lp = new ViewGroup.LayoutParams((int) mWidth, (int) mHeight);
			} else {
				lp.width = (int) mWidth;
				lp.height = (int) mHeight;
			}
			ivMember.setLayoutParams(lp);
			ivMember.setAdjustViewBounds(true);
			ivMember.setImageResource(memberLevelIcons[i]);
			if (vipLevel <= 0) {
				ivMember.setId(i);
				ivMember.setOnClickListener(this);
			}
			ivMembers.add(ivMember);
		}

		vpMember.getLayoutParams().height = (int) mHeight;
		loopPagerAdapter = new LoopPagerAdapter(ivMembers);
		vpMember.setAdapter(loopPagerAdapter);
		vpMember.setPageMargin(20);//设置两边显示的距离

		vpMember.setCurrentItem(ivMembers.size()*100)//进行不断循环需要设置的
 //将父类的touch事件分发至viewPager,否则只能滑动中间的一个view对象ll_container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return vpMember.dispatchTouchEvent(event);}});}


4、LoopPagerAdapter 适配器

public class LoopPagerAdapter extends PagerAdapter{

	private List<View> showViews;

	public LoopPagerAdapter(List<View> showViews) {
		this.showViews = showViews;
	}

	@Override
	public int getCount() {
		return Integer.MAX_VALUE;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0==arg1;
	}

	@Override
	public Object instantiateItem(View container, int position) {
		int pos = position % showViews.size();
		View view = showViews.get(pos);
		ViewGroup parent = (ViewGroup) view.getParent();
		if (parent != null) {
			parent.removeView(view);
		}
		((ViewPager) container).addView(view);
		return view;
	}

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
	}
}

这样就完成了用Viewpager既能显示上一页的一部分和下一页的一部分又能不断进行循环滑动。

猜你喜欢

转载自blog.csdn.net/kaoshibiguo_1/article/details/54292710