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

Android使用ViewPager做无限轮播,人为滑动时停止

2016-11-27 22:35 537 查看

实现无限循环

使用取模,获取到当前图片所在的位置。

private class MyPagerAdapter extends PagerAdapter {
private Context context;
List<ImageView> list;

public MyPagerAdapter(Context context, List<ImageView> list) {
this.context = context;
this.list = list;
}

@Override
public int getCount() {
//使用Integer的最大值,这样基本上就不需要滑动到最后了
//除非用户很蛋疼
return Integer.MAX_VALUE;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
//当前位置模上总数等于图片在数组中的位置
position %= list.size();
if (position < 0) {
position = list.size() + position;
}
ImageView imageView = list.get(position);
//设置轮播点击事件
final int finalPosition = position;
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), BannerActivity.class);
intent.putExtra("position", finalPosition);
startActivity(intent);
}
});
ViewGroup parent = (ViewGroup) imageView.getParent();
if (parent != null) {
parent.removeView(imageView);
}
container.addView(imageView);
return list.get(position);
}

@Override
public boolean isViewFromObject(View view, Object object) {
return object == view;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//注意这里不要使用
//container.removeView(list.get(position));
}
}


自动循环实现

使用Handler每隔5秒一次消息,接收到轮播的动作就继续发一次消息,实现自动轮播的效果。

private class MyHandler extends Handler {
private Context context;
//使用弱引用,避免handler造成内存泄露
private WeakReference<MainActivity> weakReference;

public MyHandler(WeakReference<MainActivity> weakReference) {
this.weakReference = weakReference;
}

@Override
public void handleMessage(Message msg) {
MainActivity activity = weakReference.get();
//Activity不存在了,就不需要再处理了
if (activity == null) {
return;
}
//如果已经有消息了,先移除消息
if (activity.handler.hasMessages(BANNER_NEXT)) {
activity.handler.removeMessages(BANNER_NEXT);
}
switch (msg.what) {
case BANNER_NEXT:
//跳到下一页,
int currentItem = vpBanner.getCurrentItem();
activity.vpBanner.setCurrentItem(++currentItem);
//5秒后继续轮播
activity.handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);
break;
case BANNER_PAUSE:
//暂停,不需要做任务操作
break;
case BANNER_RESUME:
//继续轮播
activity.handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);
break;
}
}
}


在Activity中使用

//这里放了3张图片,使用Gilde加载
ImageView imageView1 = new ImageView(this);
ImageView imageView2 = new ImageView(this);
ImageView imageView3 = new ImageView(this);
RequestManager requestManager = Glide.with(this);
requestManager.load("http://img1.imgtn.bdimg.com/it/u=3251910782,1174316217&fm=21&gp=0.jpg").into(imageView1);
requestManager.load("http://pic2.ooopic.com/10/78/50/34b1OOOPICf0.jpg").into(imageView2);
requestManager.load("http://www.swkweike.com/data/uploads/2015/08/18/193226787255d2dbd711a33.jpg").into(imageView3);
List<ImageView> list = new ArrayList<>();
list.add(imageView1);
list.add(imageView2);
list.add(imageView3);
MyPagerAdapter adapter = new MyPagerAdapter(this, list);
vpBanner = (ViewPager) findViewById(R.id.vpBanner);
vpBanner.setAdapter(adapter);
//将起始位置设置在中间,让用户看不到边界
vpBanner.setCurrentItem(Integer.MAX_VALUE / 2);
//开始轮播
handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);


用户滑动时停止轮播,松开时继续轮播

使用ViewPager的滑动监听事件,判断用户是否正在滑动

vpBanner.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {

}

@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_DRAGGING:
//用户正在滑动,暂停轮播
handler.sendEmptyMessage(BANNER_PAUSE);
break;
case ViewPager.SCROLL_STATE_IDLE:
//滑动结束,继续轮播
handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);
break;
}

}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息