viewpager实现无限循环滚动幻灯片

一直想做循环滑动幻灯片的效果,类似pptv等的首页效果十分抱歉,不会整gif动图~~~

废话少说,先上图看效果:

  

思路是:设置pageradapter的count为Integer.MAX_VALUE,但实际的item只有几个,用取余的方式取item,在设置adapter时同时设置currentItem为实际item数的N倍(足够大就好)。这样就可以左右无缝循环滑动!(毕竟你不可能滑上亿次),并且不用担心内存问题,就那几个玩意~~~

这里不能用FragmentPagerAdapter或FragmentStatePagerAdapter,因为这两个的item是fragment,他们有自己的fragment管理机制,要是用,getFragment()返回同一个fragment(指针一样)就会报错,不信就试试~~~

要继承PagerAdapter,使用view作为item,重写必要的方法。。。

图上右下角的指示器并不是我做的,但我稍微修改了一下,使他使用于我的“无限循环方式”。

废话太多了,上部分源码:

这是adapter的:

/**
 * 自定义视图幻灯片 适配器
 * 无限循环
 * @author hezb
 */
public class CustomViewPagerAdapter extends PagerAdapter{

	private final String TAG = "hezb";

	private int realCount = 0;

	private ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
			ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

	private List<View> viewList;

	/**
	 * 传入 自定义 view 的列表
	 */
	public CustomViewPagerAdapter(List<View> viewList) {
		if (viewList == null) {
			Log.e(TAG, "CustomViewPagerAdapter   viewList is null!");
			return;
		}
		realCount = viewList.size();
		this.viewList = viewList;
		for (int i = 0; i < viewList.size(); i++) {
			viewList.get(i).setLayoutParams(lp);
		}
	}

	@Override
	public int getCount() {
		return realCount == 0 ? 0 : Integer.MAX_VALUE;
	}
	/**
	 * @return 实际的 item 数
	 */
	public int getRealCount(){
		return realCount;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;
	}

	@Override
	public Object instantiateItem(View container, int position) {
		position = position % realCount;
		try {
			((ViewPager) container).addView(viewList.get(position));
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

		return viewList.get(position);
	}

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		position = position % realCount;
		try {
			((ViewPager) container).addView(viewList.get(position));
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

		return viewList.get(position);
	}

	@Override
	public void destroyItem(View container, int position, Object object) {
		((ViewGroup) container).removeView((View) object);
	}

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		((ViewGroup) container).removeView((View) object);
	}

}

唉,表达能力有待提高,直接下工程文件看看吧!

点击下载!!!

时间: 2024-10-26 12:07:52

viewpager实现无限循环滚动幻灯片的相关文章

【Android】ViewPager实现无限循环滚动

最近做的一个项目,客户要求在ViewPager实现的主页面中滑动到最后一页后继续滑动能返回到第一页,也就是实现无限循环滚动,效果如下: 看了下ViewPager没有滑到尽头的回调方法,因此想到的解决方案是,在原来的最后一页之后再加上一个第一页,也就是原本有编号为a1,b,c的三个页面,现在在最后面再加一个a页面,变为a1.b.c.a2四个页面,然后使用OnPageChangeListener中的onPageSelected方法来监听到页面切换,当发现是从第三个页面(c)切换到第四个页面(a1)时

iOS无限循环滚动实现

原文链接: iOS无限循环滚动实现 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/MajorLMJ iOS开发者公会-技术1群 QQ群号:87440292 iOS开发者公会-技术2群 QQ群号:232702419 iOS开发者公会-议事区   QQ群号:413102158

unity 背景无限循环滚动效果

背景无限循环滚动效果如下示: 步骤如下: 导入背景图片后,设置图片的格式,如下图: 2.图片格式也可以设置是Texture格式,但是Wrap Mode 一定要是Repeat[重复发生]:然后记得Apply一下.[解释:Wrap mode :循环模式:换行模式:包裹模式:缠绕] 3.在Hierachy视图中,新建2D Object-〉Sprite 或者一个Image,将之前设置好的精灵放入Texture. 4.在Project视图鼠标右键新建一个Shader,命名随意,然后在编辑器中修改Shade

详细分析Android viewpager 无限循环滚动图片

由于最近在忙于项目,就没时间更新博客了,于是趁着周日在房间把最近的在项目中遇到的技术总结下.最近在项目中要做一个在viewpager无限滚动图片的需求,其实百度一下有好多的例子,但是大部分虽然实现了,但是讲的都不清楚,我查了很多资料,我就知道position/list.size().但是怎么用,我还是不明白.我后来看了百度工程师任玉刚的循环广告位组件的实现突然明白了无限滚动的原理.总结如下: 1.要在int getCount() 方法里 写 return BANNER_SIZE.  这个 BAN

viewpager 自动无限循环 这段代码移到你的程序中就可以用了

本程序需要懂得viewpager的基础知识,也就是说你能够自己写出一个手动滑动的viewpager,下面我将附带加小圆点的知识 那么我们回顾一下图片轮转的基础知识,如果你已经对viewpager很熟悉了就不用看了,浪费时间 1.viewpager是在v4兼容报里面的,使用控件时请带上报名 2.数据来源用list存放,我这里用的是textview做的小圆点list<textview>,layout做的单张幻灯片list<view>,将xml文件inflate成为view,View.i

iOS无限循环滚动scrollview

经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播的代码,也不了解他们的原理,我今天封装这个图片无限轮播是借鉴Web前端中的做法,因为之前写Web前端的时候,实现幻灯片就是这么做的,今天就在iPhone上搞搞.下面的东西是自己写的了,关于轮播的东西这个开源项目也是相当不错的https://github.com/nicklockwood/iCarousel ,

无限循环滚动视图思路一

一.思路分析 不考虑内存 1.如果有5张图片,可以放7张UIImageView,排列是 4 0 1 2 3 4 0,但图片多时对内存太依赖. 优化内存 1.需要用3个UIImageView来实现即可. 初始状态 - 一开始,把contentoffset设置到中间的那张imageView上,也就是显示中间的imageView,并且以后每次滚动完都会进行这样的设置,这里先记住 - 图中显示的是第0张图片,所以向左滑动显示的肯定是最后一张图片,也就是第4张,同理,右滑是第1张 - 所以,三张image

Cocos2dx中利用双向链表实现无限循环滚动层

[Qboy原创] 在Cocos2dX 3.0 中已经实现一些牛逼的滚动层,但是对于有一些需要实现循环滚动的要求确没有实现,笔者在前段时间的一个做了一个游戏,需求是实现在少有的(13个)英雄中进行循环滚动层,即用户可以无限的向一个方向滚动,当到最后时,由前面的进行重复出现. 如下图: 为了满足以上需求,我第一反应就想到了采用大学数据结构中所学的双向链表.想想还真称靠谱诶.那就说干就干吧. 1.定义双向链接表结构: struct CycNode{//构建双向链表结构 CycNode* preNode

自定义完美的ViewPager 真正无限循环的轮播图

网上80%的思路关于Android轮播图无限循环都是不正确的,不是真正意义上的无限循环, 其思路大多是将ViewPager的getCount方法返回值设置为Integer.MAX_VALUE, 然后呢将ViewPager的当前展示页设置为第1000页或者是10000页,这样用户一般情况下是滑不到边界的 例如有5张图片的轮播图,item的编号为(0,1,2,3,4)当前页的页号如果是5, 这时候就将编号设置为0,即 actPosition %= datas.size();这个公式就是这么来的 这种