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

编程知识 行业动态 更新时间:2024-06-13 00:21:18

实现一个用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既能显示上一页的一部分和下一页的一部分又能不断进行循环滑动。

更多推荐

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

本文发布于:2023-03-31 14:35:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/7c3c73c5b4247bf129e59831b6815d84.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:下一页   上一页   分和   Viewpager

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!