概述

  应用首页的广告轮播Banner,一般都会使用ViewPager来实现,但是ViewPager 没有轮播效果。
现成有这么几种实现方案,
  1.使用Integer.MAX_VALUE ,理论上很难达到边界。
  2.装饰adapter方式[imbryk/LoopingViewPager@Github]
  3.扩展ViewPager方式[yanzm/LoopViewPager]

相关库

  轮播效果其实就是一个定时任务,可以用定时器,Handler等。

[Trinea/Android Auto Scroll ViewPager@Github]

此库通过handler定时发送消息实现,用的比较多,使用中感觉切换并非无缝。主要代码如下:

/** * scroll only once */
public void scrollOnce() {
  PagerAdapter adapter = getAdapter();
  int currentItem = getCurrentItem();
  int totalCount;
if (adapter == null || (totalCount = adapter.getCount()) <= 1) {
  return;
}
int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;
if (nextItem < 0) {
  if (isCycle) {
    setCurrentItem(totalCount - 1, isBorderAnimation);
  }
} else if (nextItem == totalCount) {
  if (isCycle) {
    setCurrentItem(0, isBorderAnimation);
  }
} else {
    setCurrentItem(nextItem, true);
    }
}

  

这里是在最后或第一页直接setCurrentItem(),因此,并非无缝轮播效果。

和本文开头的几个控件整合一下,即可方便 的实现我们想要无缝 的效果。

基本实现

1.修改[Trinea/Android Auto Scroll ViewPager@Github]

改变首页和最后一页的跳转设置。

    /**
* scroll only once
*/
public void scrollOnce() {
PagerAdapter adapter = getAdapter();
int currentItem = getCurrentItem();
if (adapter == null || adapter.getCount() <= 1) {
return;
} int nextItem = (direction == LEFT) ? --currentItem : ++currentItem;
setCurrentItem(nextItem, true);
}

  

2.实现方式选择

第一种方式其实主要改变了adapter中的index,大体如下:

@Override public int getCount() {
  return Integer.MAX_VALUE;
}
@Override public Object instantiateItem(ViewGroup container, int position) {
  position = position % listviews.size() ;
  //....
}

  

只是理论上的无限,需要自己处理position

第二种装饰了adapter,在前后各添加一个Item,当到了我们添加的临界item的时候,立即设置到正确的 position ,主要方法如下:

LoopPagerAdapterWrapper

int toRealPosition(int position) {
int realCount = getRealCount();
if (realCount == 0) return 0;
int realPosition = (position-1) % realCount;
if (realPosition < 0) realPosition += realCount;
return realPosition;
}

  

这里,内部封装position映射,不需要自己处理position,和正常ViewPager使用方式一样。

第三种,重写扩展ViewPager 继承 ViewGroup,使其item无限。需要自己处理position,而且 和 [JakeWharton/ViewPagerIndicator@Github]搭配使用起来不是很方便,setViewPager方法需要额外处理。

综上,使用第二种方式 扩展性和 易用性都比较好。

Indicator

[JakeWharton/ViewPagerIndicator@Github]
这是一个比较全面的indicator,如果我们只需要简单的CircleIndicator,可以抽取来使用。

优秀相关开源库:
[THEONE10211024/CircleIndicator@Github]
[ongakuer/CircleIndicator@Github]

也可以看看本人站在巨人肩膀上完成的[DrawableIndicator@Github]
实时偏移,切换动画,drawable资源

测试 

  my_banner.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"> <com.bobomee.android.scrollloopviewpager.autoscrollviewpager.AutoScrollViewPager
android:id="@+id/picslooper1"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <com.bobomee.android.drawableindicator.widget.DrawableIndicator
android:id="@+id/pageIndexor1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
app:indicator_height="15dp"
app:indicator_margin="15dp"
app:indicator_select_src="@drawable/select_drawable"
app:indicator_unselect_src="@drawable/unselect_drawable"
app:indicator_width="15dp" />
</RelativeLayout>

   MainActivity:

AutoScrollViewPager viewPager = (AutoScrollViewPager) findViewById(R.id.picslooper1);
viewPager.setFocusable(true);
viewPager.setAdapter(new FragmentStateAdapter(getSupportFragmentManager())); BaseIndicator pageIndex = (BaseIndicator) findViewById(R.id.pageIndexor1);
pageIndex.setViewPager(viewPager); viewPager.startAutoScroll();

  
  最终效果图:

源码:
AutoScrollLoopViewPager@[Github]

Android真正意义上的无限轮播Banner的更多相关文章

  1. Android实现广告页图片无限轮播

    一.概述 对于一个联网的Android应用, 首页广告无限轮播基本已经成为标配了. 那么它是怎么实现的呢? 有几种实现方式呢? 二.无限轮播的实现 1.最常规的手段是用 ViewPager来实现 2. ...

  2. Android之仿京东淘宝的自动无限轮播控件

    在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于Re ...

  3. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  4. android-自定义广告轮播Banner(无限循环实现)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  5. ViewPager实现无限轮播踩坑记

    最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...

  6. iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)

    这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...

  7. iOS开发之ImageView复用实现图片无限轮播

    在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...

  8. iOS开发UI篇—无限轮播(循环利用)

    iOS开发UI篇—无限轮播(循环利用) 一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...

  9. iOS开发UI篇—无限轮播(循环展示)

    iOS开发UI篇—无限轮播(循环展示) 一.简单说明 之前的程序还存在一个问题,那就是不能循环展示,因为plist文件中只有五个数组,因此第一个和最后一个之后就没有了,下面介绍处理这种循环展示问题的小 ...

随机推荐

  1. 我和CPP的第二次约会

    1.变量之间的运算形式依赖于变量的数据类型,如i = i + j;当 i 和 j 是整型或者浮点型,则代表两个数的相加,如果是第一章所说的Sales_item类型,那么就是这两个变量的成分相加(如果书 ...

  2. Day10 网络编程(续)

    作用域 Python的作用域是函数,没有块级作用域 if 1 == 1: name = 'wang' print(name) #wang   for i in range(10): name = i ...

  3. 实现OC与JS的交互

        oc-->js stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数.一句js代码或他们 ...

  4. Python 更改cmd中的字色

    没有gui的python程序是在cmd窗口中运行的,黑色背景,灰色的字,确实很复古,不符合现代人的使用习惯-同事在用我写的小工具时,清一色的字色,看起来会没有重点性,因此我就想通过更改cmd中的字色来 ...

  5. 1、MyBatisNet的安装使用

    用到的几个DLL按理说应该到官网下载,但这个官网是谷大哥的,不知道是不是被屏蔽,总打不开,幸好从别人的程序里拷过来一份,直接放在自己的程序里就行! 程序结构如下: Providers.config,S ...

  6. BZOJ 1070 修车

    Description 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这\(M\)位技术 ...

  7. Unity OF 3DMax毛坯房制作标准

    Unity OF 3DMax毛坯房制作标准 1.模型 2.贴图 3.模型塌陷展UV 4.灯光 5.Radiosity 6.Render  To   Texture 7.烘焙 8.导出 1.模型回目录 ...

  8. Automated Telephone Exchange

    Time Limit: 3000MS Memory limit: 65536K 题目描述In St Petersburg phone numbers are formatted as “XXX–XX– ...

  9. Qt之自定义托盘(两种方法)

    http://www.cnblogs.com/swarmbees/p/5789482.html http://www.cnblogs.com/swarmbees/p/5812031.html

  10. Compare Version Number

    package cn.edu.xidian.sselab.string; /** *  * @author zhiyong wang * title: Compare Version Numbers  ...