您的位置:首页 > 移动开发 > Android开发

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

2016-04-24 08:12 483 查看

右滑轮播问题解决

我使用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;
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: