Android学习(41) -- 自定义控件(5)图片轮播(伪循环)

右滑轮播问题解决 

     我使用ViewPager进行图片轮播时候,发现当到了开头或末尾不能再继续了,此时是因为PagerAdapter中的getCount方法进行了限定,明确了具体的数量,当到达数量的时候的,就不在进行调用instantiateItem方法了。如果想改变的话我们可以将getCount中返回值设置为最大值即可,即:Integer.MAX_VALUE。

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

我们还需要在instantiateItem和 updateIntroAndDot中

在获取位置处进行取模操作   % list.size()

@Override
		public Object instantiateItem(ViewGroup container, int position) {
			//将广告布局添加进来
			View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null);
			
			//获取到布局中ImageView  
			ImageView imageView = (ImageView) view.findViewById(R.id.img);
			
			//获取到集合中指定的AD数据
			Ad ad = list.get(position % list.size());
			//将图片设置到ImageView 上
			imageView.setImageResource(ad.getResId());
			
			//一定不能少,将view加入到viewPager中
			container.addView(view);
			
			return view;
		}


	private void updateIntroAndDot() {
		//获取到当前第几页
		int currentPage = viewPage.getCurrentItem() % list.size();
		//设置文本信息
		tv.setText(list.get(currentPage).getIntro());
		
		for (int i = 0; i < lay_dot.getChildCount(); i++) {
			lay_dot.getChildAt(i).setEnabled(i == currentPage);
		}
	}


左滑轮播问题解决

但是我们会发现当在第一个的时候向左滑动是有问题的,我们需要解决这个问题

1、我们需要在initData中设置 当前的item 

2、我们发现Integer.MAX_VALUE/2;   //正好在中间的位置

3、currentItem % list.size();能够获取到和第一个位置0的差值

4、用2中的值减去3中的差值 作为参数传递到instantiateItem方法中去的时候再 % list.size();就是0


	/**
	 * 初始化数据
	 */
	private void initData() {
		list.add(new Ad(R.drawable.a, "不低俗,不能低俗"));
		list.add(new Ad(R.drawable.b, "回来了,再唱经典老歌引百万人同唱啊"));
		list.add(new Ad(R.drawable.c, "电影如何升级"));
		list.add(new Ad(R.drawable.d, "TV版大放送"));
		list.add(new Ad(R.drawable.e, "热血的反杀"));
		
		initDot();
		
		tv.setText(list.get(0).getIntro());
		
		//绑定Adapter
		viewPage.setAdapter(new MyPagerAdapter());
		
		//当第一屏的时候 解决向左滑动问题
		int currentItem = Integer.MAX_VALUE/2;    //正好在中间的位置
		int value = currentItem % list.size();
		viewPage.setCurrentItem(currentItem - value);	
		
		//更新数据
		updateIntroAndDot();
	}

最后我们实现自动播放

在initData()中添加 延迟操作 ,也就是说第一个图片的时候 发送一个空消息 延迟操作到handler中去

hand.sendEmptyMessageDelayed(0, 4000);

定义Handler进行操作,在handler中接收消息后,让当前的item增加1,然后自己再给自己发送空消息,形成循环,即可成为自动播放

Handler hand = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			viewPage.setCurrentItem(viewPage.getCurrentItem()+1);
			hand.sendEmptyMessageDelayed(0, 4000);
		}
	};

触发触摸事件

在initData中进行处理

	//暂停
		viewPage.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					//清除所有的callback 和 message
					hand.removeCallbacksAndMessages(null);
					break;

				case MotionEvent.ACTION_UP:
					//继续轮播
					hand.sendEmptyMessageDelayed(0, 4000);
					break;
				}
				
				return false;
			}
		});




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值