Android真正意义上的无限轮播Banner
概述
应用首页的广告轮播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();
最终效果图:
Android真正意义上的无限轮播Banner的更多相关文章
- Android实现广告页图片无限轮播
一.概述 对于一个联网的Android应用, 首页广告无限轮播基本已经成为标配了. 那么它是怎么实现的呢? 有几种实现方式呢? 二.无限轮播的实现 1.最常规的手段是用 ViewPager来实现 2. ...
- Android之仿京东淘宝的自动无限轮播控件
在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于Re ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- android-自定义广告轮播Banner(无限循环实现)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- ViewPager实现无限轮播踩坑记
最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...
- iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)
这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...
- iOS开发之ImageView复用实现图片无限轮播
在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...
- iOS开发UI篇—无限轮播(循环利用)
iOS开发UI篇—无限轮播(循环利用) 一.无限轮播 1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollV ...
- iOS开发UI篇—无限轮播(循环展示)
iOS开发UI篇—无限轮播(循环展示) 一.简单说明 之前的程序还存在一个问题,那就是不能循环展示,因为plist文件中只有五个数组,因此第一个和最后一个之后就没有了,下面介绍处理这种循环展示问题的小 ...
随机推荐
- Android获取相册图片
1. AlertDialog的使用 2. 显示和隐式意图的区别 3. 相册页面的跳转 4. 选择完成后返回图片的获取 ----------------------------------------- ...
- UIControl-IOS开发
UIControl-IOS开发 UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedControl分段控件.UISlider滑块.UITextField文本 ...
- hadoop 异常 INFO ipc.Client: Retrying connect to server:
// :: INFO ipc.Client: Retrying connect to server: master/. Already tried , sleepTime= SECONDS) // : ...
- [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...
- ExtJS简单的动画效果2(ext js淡入淡出特效)
Ext 开发小组则提供了 Fx 类集中处理了大部分常用的 js 动画特效,减少了我们自己手写代码的复杂度. 面我给出一个简单的实例代码,其中囊括了大部分的 Ext 动画效果: (注意导入js和css文 ...
- 启明星辰:安全管理平台(SOC)
泰 合信息安全运营中心(Security Operation Center)系统是一个以IT资产为基础,以业务信息系统为核心,以客户体验为指引,从监控.审计.风险.运维四个维度建立起来的一套可度量的统 ...
- hdu 5113 Black And White
http://acm.hdu.edu.cn/showproblem.php?pid=5113 题意:给你n*m的格子,然后在每个格子内涂色,相邻格子不能同色,然后给你每个颜色涂的格子的固定个数,然后可 ...
- 加载dll、lib库
2.是关于如何加载dll或lib库的.可以看这篇bog Qt调用dll中的功能函数点击打开链接 ************************************************** ...
- visualvm监控jvm及远程jvm监控方法(转)
VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用创建一个整套的问题解决工具.它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览H ...
- (转载)php数组添加、删除元素的方法
(转载)http://www.phpgs.com/html/php/phpjichu/20120130440.html 带来一篇php 数组 添加元素.删除元素的方法的文章,有需要的php学习者参考下 ...