Android自定义控件系列——轮播图案例

轮播图

1 基础功能

vp = (ViewPager) findViewById(R.id.vp);	//获取ViewPager对象
vp.setAdapter(new MyAdapter(images));			//设置适配器,传入数据
vp.setCurrentItem(1);	//设置初始化画当前页
 public MyAdapter(List<Integer> images){
 	this.images = images;	//构造传入数据
 }
 @Override
 public int getCount(){
 	return images.size();	//返回数据大小
 }
 @Override
 public Object instantiateItem(ViewGroup container, int position){
     ImageView view = new ImageView(container.getContext());	//创建或挂载视图
     view.setBackgroundResource(images.get(position));
     container.addView(view);	//将视图添加到container中
     return view;	//返回item视图
 }
@Override	//是否使用缓存view
public boolean isViewFromObject(View view, Object object){
	return view == object;		
}
@Override	//销毁一个item
public void destroyItem(ViewGroup container, int position, Object object){
	container.removeView((View) object);
}

2 无限轮播

1  初始化
images.add(0,最后一个位置的图片)//在数据的第一个位置添加最后一张
images.add(第一个位置的图片)//在数据的最后一个位置添加第一张
2  设置页面滑动监听
vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener(){
	@Override
	public void onPageSelected(int position){
		if (images.size() > 1){	//轮播图图片数量保护
			if (position < 1){	//滑到第一张时,将当前页面设置到最后一张图片
				position = images.size() - 2;
				vp.setCurrentItem(position, false);//false代表不平滑滑动,瞬间滑动
				//滑到最后一张时,将当前页面设置到第一张
			} else if (position > images.size() - 2){
				position = 1;
				vp.setCurrentItem(position, false);
...
3  跟图片数量相关的位置,加图片数量保护
@Override
public int getCount(){	//当size<3时,代表只有一张图片,此处需按实际情况处理
   return images.size() > 3 ? images.size() : 1;
}

3 自动轮播

1  设置hanlder
private static final int start_roll = 1;
private Handler MyHandler = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if (msg.what == start_roll){
            if (vp != null){
                vp.setCurrentItem(vp.getCurrentItem() + 1);	//将当前页面加1
                this.sendEmptyMessageDelayed(start_roll,2000);//从新发送延时消息
 ...
2  监听页面触摸
@Override
public boolean onTouchEvent(MotionEvent event){
	switch (event.getAction()){
		case MotionEvent.ACTION_DOWN:
         case MotionEvent.ACTION_MOVE:
			MyHandler.removeMessages(start_roll);
		break;
		case MotionEvent.ACTION_UP:
         case MotionEvent.ACTION_CANCEL:
			MyHandler.sendEmptyMessageDelayed(start_roll,2000);
		break;
	}
	return false;
 }

猜你喜欢

转载自blog.csdn.net/mLuoya/article/details/87909967