ViewPager

在项目开发中,我们经常会在软件的主页使用ViewPager来进行图片的无限次的自动轮换展示,但是常规的viewPager很显然不能满足我们的这个要求,那么我们就需要对ViewPager进行一些小小的改动,来达到我们实际想要的效果。下面是写的一个小Demo,大家可以看一下,原理其实非常简单。这个demo里实际上也不是真正的无限轮播,因为只是讲viewPager的最大页数修改为了整数的最大值,所以,理论上来说,还是有尽头的,不过在实际使用中,用户基本不会发现这种情况。所以,大家可以尝试一下。

代码如下:

首先是布局文件:


   
   

    
    
    
    
    
    
    
    

    
    
    
    
    
    
    
    


   
   

然后制作小圆点,用shape制作:

红色圆点:


    
    
    
     
     
    
     
     

    
    
灰色圆点:

    
    
    
     
     
    
     
     

    
    
圆点选择器

    
    
    
     
     
    
     
     

    
    


//另外小圆点需要的颜色,colors文件夹下:
    
    
    
     
     #ff0000
    
    
    
    
    
     
     #999999
    
    
具体执行代码:
public class MainActivity extends Activity {

	private ViewPager vp;
	private LinearLayout ll;
	private ProgressBar par;
	private WebView webview;
	private ArrayList
    
    
     
      imglist;
	private ArrayList
     
     
      
       yuanList;
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			vp.setCurrentItem(vp.getCurrentItem() + 1);
			// handler.sendEmptyMessageAtTime(0, 2000);
			handler.sendEmptyMessageDelayed(0, 2000);
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		vp = (ViewPager) findViewById(R.id.vp);
		ll = (LinearLayout) findViewById(R.id.ll);
		// par = (ProgressBar) findViewById(R.id.pbar);
		// webview = (WebView) findViewById(R.id.web);

		// 创建轮播
		initLunBo();

		// 设置适配器
		vp.setAdapter(new Myadater());
		handler.sendEmptyMessageDelayed(0, 2000);
		// handler.sendEmptyMessageAtTime(0, 2000);
		// 设置滑动件听
		vp.setOnPageChangeListener(new OnPageChangeListener() {

			@Override
			public void onPageSelected(int arg0) {
				int newposition = arg0 % yuanList.size();
				for (int i = 0; i < yuanList.size(); i++) {
					yuanList.get(i).setSelected(false);
				}
				yuanList.get(newposition).setSelected(true);

			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub

			}
		});
		
		// viewpager的触摸事件,点击图片停止轮播,松开继续轮播
		vp.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					//点击触摸图片后,清空handler消息
					handler.removeCallbacksAndMessages(null);
					break;
				case MotionEvent.ACTION_UP:
					//松开手之后,继续发消息开始轮播
					handler.sendEmptyMessageDelayed(0, 2000);
					break;

				default:
					break;
				}
				return false;
			}
		});
	}

	class Myadater extends PagerAdapter {

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return Integer.MAX_VALUE;
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			int newposition = position % imglist.size();
			ImageView imageView = imglist.get(newposition);
			container.addView(imageView);
			return imageView;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			int newposition = position % imglist.size();
			container.removeView(imglist.get(newposition));
			// super.destroyItem(container, position, object);
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return arg0 == arg1;
		}

	}

	private void initLunBo() {
		imglist = new ArrayList
      
      
       
       ();
		yuanList = new ArrayList
       
       
        
        ();
		int[] picture=new int[]{R.drawable.a,R.drawable.aa,R.drawable.aaa,R.drawable.aaaa};

		for (int i = 0; i < picture.length; i++) {
			//创建出一个imageview对象,设置viewPager的每页图片
			ImageView imageView = new ImageView(MainActivity.this);
			imageView.setImageResource(picture[i]);
			//测量值
			imageView.layout(0, 0, 200, 200);
			//图片平铺的类型
			imageView.setScaleType(ScaleType.CENTER_CROP);
			//存放进图片集合
			imglist.add(imageView);
			//创建小圆点
			ImageView imageView2 = new ImageView(MainActivity.this);
			imageView2.setBackgroundResource(R.drawable.select);
			imageView2.setPadding(5, 5, 5, 5);
			//把小圆点放进摆放显示圆点的布局里
			ll.addView(imageView2);
			//存放进圆点集合
			yuanList.add(imageView2);
			
		}
		
	}

}
       
       
      
      
     
     
    
    


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ViewPager嵌套ViewPager的实现可以通过使用Fragment来实现。具体步骤如下: 1. 创建外层ViewPager的适配器,内层ViewPager的适配器和内层ViewPager的Fragment适配器; 2. 在外层ViewPager的Fragment中创建内层ViewPager,并设置内层ViewPager的适配器为内层ViewPager的适配器; 3. 在内层ViewPager的Fragment中创建需要的子Fragment,并设置内层ViewPager的Fragment适配器为子Fragment的适配器。 代码示例: ```java public class OuterFragment extends Fragment { private ViewPager mInnerViewPager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_outer, container, false); mInnerViewPager = view.findViewById(R.id.inner_view_pager); InnerPagerAdapter innerPagerAdapter = new InnerPagerAdapter(getChildFragmentManager()); mInnerViewPager.setAdapter(innerPagerAdapter); return view; } private class InnerPagerAdapter extends FragmentPagerAdapter { public InnerPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return InnerFragment.newInstance(position); } @Override public int getCount() { return 3; } } } public class InnerFragment extends Fragment { private ViewPager mSubViewPager; public static InnerFragment newInstance(int position) { InnerFragment fragment = new InnerFragment(); Bundle args = new Bundle(); args.putInt("position", position); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_inner, container, false); mSubViewPager = view.findViewById(R.id.sub_view_pager); SubPagerAdapter subPagerAdapter = new SubPagerAdapter(getChildFragmentManager()); mSubViewPager.setAdapter(subPagerAdapter); return view; } private class SubPagerAdapter extends FragmentPagerAdapter { public SubPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return SubFragment.newInstance(position); } @Override public int getCount() { return 3; } } } public class SubFragment extends Fragment { public static SubFragment newInstance(int position) { SubFragment fragment = new SubFragment(); Bundle args = new Bundle(); args.putInt("position", position); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_sub, container, false); return view; } } ``` 其中,fragment_outer.xml、fragment_inner.xml和fragment_sub.xml分别对应外层ViewPager的Fragment、内层ViewPager的Fragment和内层ViewPager的子Fragment的布局文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值