概述

应用首页的广告轮播Banner,一般都会使用ViewPager来实现,但是ViewPager 没有轮播效果。

现成有这么几种实现方案:

1.使用Integer.MAX_VALUE ,理论上很难达到边界。

2.装饰adapter方式imbryk/LoopingViewPager@Github。

3.扩展ViewPager方式yanzm/LoopViewPager。

相关库

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

此库通过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(),因此,并非无缝轮播效果。

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

基本实现

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

/**

* 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,可以抽取来使用。

优秀相关开源库:

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

效果图:

DrawableIndicator

测试

my_banner.xml:

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/picslooper1"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

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" />

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

无线轮播android,Android无限轮播Banner的实现相关推荐

  1. android viewpager无限轮播

    概述 github地址:https://github.com/Double2hao/ViewPagerCycleTest 一直很好奇ViewPager无限轮播的实现方式,于是稍微研究了下,作此文记录之 ...

  2. Android之无限轮播图源代码

    Android轮播广告图是大家经常用到的一个控件今天便撸了一把代码 实现步骤 使用Viewpager进行实现图片滑动 设置ViewPager的数据,让其无限切换 Activity代码 public c ...

  3. vue 实现无限轮播_vue图片无限轮播

    近期项目中出现了很多图片轮播的需求,趁此机会写了一个关于图片自动轮播,手动切换的小Demo,具体效果看下图: 屏幕快照 2018-10-25 上午9.47.30.png 具体实现代码如下: v-sho ...

  4. ViewPager两种方式实现无限轮播

    给自己的忠告:虽然轮子很好用,但是使用轮子的前提是:如果不去封装一些复杂的功能,自己会用最基本的方法写一个,不然再好的轮子那也是别人的,当自己项目遇到和轮子不一样的地方,那就只能束手无策或者改人家的源 ...

  5. android 轮换实现动画,怎么在Android中实现一个首页无限轮播功能

    怎么在Android中实现一个首页无限轮播功能 发布时间:2021-04-12 16:22:49 来源:亿速云 阅读:74 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中实现 ...

  6. android画廊效果的轮播图,ViewPage实现无限轮播画廊效果

    1. 效果图 2. 布局文件 主要使用的 android:clipChildren的意思:是否限制子View在其范围内.再父布局和viewpager中设置该属性  ,要显示三个界面 ,还要设置marg ...

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

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

  8. android ViewPager实现无限轮播和设置监听事件

    ViewPager的无限轮播,主要以实现为主.代码如下 首先定义activity_viewpager.xml: <LinearLayout android:layout_width=" ...

  9. android 3d布局轮播,android 图片/视频混合轮播控件banner

    android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...

  10. Android 视频图片 轮播,详解android 视频图片混合轮播实现

    循环添加视频view  图片view for (int i = 0 ;i if (beansarraylist.get(i).gettype()==1){ videoplayer = new nice ...

最新文章

  1. pandas使用groupby函数和cumsum函数计算每个分组内的数值累加值、并生成新的dataframe数据列( cumulative sum of each group in dataframe
  2. ubuntu 安装 codelite
  3. prometheus下载慢_Prometheus + Grafana 监控 SpringBoot
  4. 我的模块加载系统 v17的入门教程2
  5. PPT设计中的用图问题
  6. HDU 1059 Dividing 多重背包
  7. python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR
  8. java 自定义异常实例分析_Java自定义异常类的实例详解
  9. 【数字信号处理】基于matlab GUI正选信号时域+频域分析【含Matlab源码 887期】
  10. 寄存器PLC地址与寄存器modbus协议地址
  11. 集成高德地图:com.autonavi.amap.mapcore.nativeNewInstance
  12. 基于SSM开发的房屋租赁系统 JAVA
  13. 卡尔曼滤波和互补滤波的区别
  14. logback 自定义PatternLayout
  15. JavaScript 中 typeof 和 instanceof 的区别及如何判断数组
  16. 2sum/3sum/ksum 问题
  17. pd.DataFrame()函数解析(最清晰的解释)
  18. 龙族幻想服务器正在维护中,【龙族幻想】3月18日维护公告
  19. python wms系统源码_java开发的wms仓库管理系统源码(PC+Android)
  20. Flutter必备——Dart入门(上)

热门文章

  1. Docker核心原理之cgroups
  2. cad怎么调出科创易达绿化_【每日问答26】如何识别CAD图纸dwg格式版本?(内含往期)...
  3. 栈的应用就进匹配_笔记
  4. MySQL导入/导出数据
  5. 17、MySQL函数简介
  6. 1.16 Java的异常跟踪栈
  7. Acwing第 38 场周赛【完结】
  8. 【PAT乙级】1060 爱丁顿数 (25 分)
  9. 微软服务器系统玩游戏,微软将于2020年1月22日关闭Windows7游戏服务器
  10. windows不能访问linux服务器,window的vnc客户端无法访问Linux服务端的问题之一