Android中用RxJava和ViewPager实现轮播图

Android中用RxJava和ViewPager实现轮播图,第1张

概述前言很多人要实现轮播图都会想到使用ViewPager+Handler来完成轮播图的效果。但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了。

前言

很多人要实现轮播图都会想到使用VIEwPager + Handler来完成轮播图的效果。但是在RxJava快速发展的情况下,已经可以使用RxJava来代替Handler完成这样任务了。

下面我们就来介绍如何实现RxJava+VIEwPager的轮播图。

效果图如下

VIEwPager的 *** 作

说到ViwePager应该大家都不陌生,它可以结合普通的VIEw也可以结合Fragment一起使用。在此我也就不对它的使用方法进行过多的介绍了。直接开始介绍轮播的方法。

常见的轮播 *** 作

private class ImageAdapter extends PagerAdapter{ private ArrayList<ImageVIEw> vIEwList; public ImageAdapter(ArrayList<ImageVIEw> vIEwList) {  this.vIEwList = vIEwList; } @OverrIDe public int getCount() {  //设置成最大,使用户看不到边界  return Integer.MAX_VALUE; } ....}
private static class ImageHandler extends Handler{ ... @OverrIDe public voID handleMessage(Message msg) {  super.handleMessage(msg);  //检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。  if (activity.handler.hasMessages(MSG_UPDATE_IMAGE)){   activity.handler.removeMessages(MSG_UPDATE_IMAGE);  }  switch (msg.what) {   case MSG_UPDATE_IMAGE:    currentItem++;    activity.vIEwPager.setCurrentItem(currentItem);    //准备下次播放    activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,MSG_DELAY);    break;   case MSG_KEEP_SILENT:    //只要不发送消息就暂停了    break;   case MSG_BREAK_SILENT:    activity.handler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,MSG_DELAY);    break;   case MSG_PAGE_CHANGED:    //记录当前的页号,避免播放的时候页面显示不正确。    currentItem = msg.arg1;    break;   default:    break;  } } ...}

以上就是比较常见的轮播图的代码,我只是在网上随便找的。首先它的代码中将PagerAdapter的getCount()返回了一个Integer.MAX_VALUE;它的目的是为了让图片一直的播放下去,但是在一些极限情况下还是会crash的,并且它返回的数量太大了在一定程度上对内存也造成了较大的消耗。其次我们可以看到handler的代码极其的冗杂,不仅多而且逻辑也比较麻烦。 现在我们针对刚才的问题来进行优化

更好的轮播 *** 作

更好的无限播放:设置页卡视图列表时,在前后额外各加一个页卡。最前面加最后一张图片,最后面加第1张图片。然后每当切换到最前的页卡时,就替换成倒数第2个页卡;每当切换到最后的页卡时,就替换成第2个页卡。这样一来就形成了连贯,自然实现了无限滑动的功能。

1)设置VIEwPager的视图列表时,在前后各加一个页卡。

for (int i = 0; i < count + 2; i++) { if (i == 0) {// 将最前面一页设置成本来最后的那页  GlIDe.with(context).    load(imageTitleBeanList.get(count - 1).getimageUrl()).into(ivImage);  tvTitle.setText(imageTitleBeanList.get(count - 1).getTitle()); } else if (i == count + 1) {// 将最后面一页设置成本来最前的那页  GlIDe.with(context).    load(imageTitleBeanList.get(0).getimageUrl()).into(ivImage);  tvTitle.setText(imageTitleBeanList.get(0).getTitle()); } else {  GlIDe.with(context).    load(imageTitleBeanList.get(i - 1).getimageUrl()).into(ivImage);  tvTitle.setText(imageTitleBeanList.get(i - 1).getTitle()); } // 将设置好的VIEw添加到VIEw列表中 vIEwList.add(vIEw);}

2)在监听VIEwPager的页卡状态改变中,当滑动到第1个页卡时替换成倒数第2个页卡;当滑动到最后一个页卡时替换成第2个页卡。

@OverrIDepublic voID onPageScrollStateChanged(int state) { switch (state) {  // 闲置中  case VIEwPager.SCRolL_STATE_IDLE:   // “偷梁换柱”   if (vpImageTitle.getCurrentItem() == 0) {    vpImageTitle.setCurrentItem(count,false);   } else if (vpImageTitle.getCurrentItem() == count + 1) {    vpImageTitle.setCurrentItem(1,false);   }   currentItem = vpImageTitle.getCurrentItem();   break; }}

Handler现在就该由RxJava来替代了。

Interval *** 作符

创建一个按固定时间间隔发射整数序列的Observable


Interval *** 作符返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列。


RxJava将这个 *** 作符实现为interval方法。它接受一个表示时间间隔的参数和一个表示时间单位的参数。

Javadoc: interval(long,TimeUnit)

Javadoc: interval(long,TimeUnit,Scheduler)

interval默认在computation调度器上执行。你也可以传递一个可选的Scheduler参数来指定调度器。

用RxJava取代Handler

public voID start() { mVIEwPagerSubscribe = Observable.interval(5,5,TimeUnit.SECONDS) // 5s的延迟,5s的循环时间  .subscribeOn(AndroIDSchedulers.mainThread())  .observeOn(AndroIDSchedulers.mainThread())  .subscribe(new Action1<Long>() {   @OverrIDe   public voID call(Long aLong) {    // 进行轮播 *** 作    if (mWeeklyMovIEInfos != null && mWeeklyMovIEInfos.size() > 0 && isAutoplay) {     mCurrentPage++;     mWeeklyVIEwPager.setCurrentItem(mCurrentPage);    }   }  });}

为了更好的用户体验,在用户进行滑动 *** 作的时候,应该停止自动轮播

mPager.setontouchListener(new VIEw.OntouchListener() { @OverrIDe public boolean ontouch(VIEw v,MotionEvent event) { //监听VIEwPager的触摸事件,当用户按下的时候取消注册,当用户手抬起的时候再注册  switch (event.getAction()){   case MotionEvent.ACTION_DOWN:    stop();    break;   case MotionEvent.ACTION_UP:    start();    break;   }  return false; }});public voID stop() { if(mVIEwPagerSubscribe.isUnsubscribed()) {   mVIEwPagerSubscribe.unsubscribe(); }}

总结

这篇文章主要是对VIEwPager实现轮播图的一种总结。首先提出更好的轮播图的方法,其实讲解了RxJava中interval *** 作符的使用,最后用该 *** 作符替换掉Handler完美实现轮播图。以上就是这篇文章的全部内容,希望本文的内容能对大家有所帮助,如果有疑问大家可以留言交流。

总结

以上是内存溢出为你收集整理的Android中用RxJava和ViewPager实现轮播图全部内容,希望文章能够帮你解决Android中用RxJava和ViewPager实现轮播图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1148073.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存