ViewPager自身并不支持左右无限循环的功能,在网上找了很多天,发现基本都是一个原理,就是实现一种假的无限循环,取一种最大值的思路,这一种方案在上一篇中实现过,并没有真正达到左右无限循环,只是一般情况下,很难达到边界(不可滑动)的情况。下面记录一下另一种方案,网上号称是真正的无限循环。

用于显示的mViews,比数据源mList,多了两个节点元素(头节点0:b和尾节点5:e用于跳转)
下图的不带箭头的红线,是mViews根据mList初始化的情况;带箭头的红线是跳转的情况。

首先还是布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="match_parent" ></android.support.v4.view.ViewPager><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignBottom="@id/viewpager"android:background="#33000000"android:orientation="vertical"android:padding="5dip" ><TextViewandroid:id="@+id/tv_image_description"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="第一个引导页面"android:textColor="@android:color/white"android:textSize="14sp" /><LinearLayoutandroid:id="@+id/ll_points"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dip"android:layout_gravity="center_horizontal"android:orientation="horizontal" ></LinearLayout></LinearLayout></RelativeLayout>

接下来是MainActivity:

package com.example.viewpagertest;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;public class MainActivity extends Activity implements OnPageChangeListener {private List<ImageView> imageViewList;private ViewPager mViewPager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setView();initView();}public void setView() {setContentView(R.layout.activity_splash_viewpager);}public void initView() {mViewPager = (ViewPager) findViewById(R.id.viewpager);prepareData();ViewPagerAdapter adapter = new ViewPagerAdapter();mViewPager.setAdapter(adapter);mViewPager.setOnPageChangeListener(this);}private void prepareData() {imageViewList = new ArrayList<ImageView>();int[] imageResIDs = getImageResIDs();ImageView iv;for (int i = 0; i < imageResIDs.length; i++) {iv = new ImageView(this);iv.setBackgroundResource(imageResIDs[i]);imageViewList.add(iv);}}/*** 在此处本来是5张图片,现在在数组首尾各加了一张图* @return*/private int[] getImageResIDs() {return new int[]{R.drawable.pic_02,R.drawable.bg1,R.drawable.bg2,R.drawable.bg3,R.drawable.pic_01,R.drawable.pic_02,R.drawable.bg1,};}class ViewPagerAdapter extends PagerAdapter {@Overridepublic int getCount() {return imageViewList.size();}/*** 判断出去的view是否等于进来的view 如果为true直接复用*/@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}/*** 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来就是position*/@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView(imageViewList.get(position));}/*** 创建一个view*/@Overridepublic Object instantiateItem(ViewGroup container, int position) {container.addView(imageViewList.get(position));return imageViewList.get(position);}}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int position) {if ( imageViewList.size() > 1) { //多于1,才会循环跳转if ( position < 1) { //首位之前,跳转到末尾(N)position = 5; mViewPager.setCurrentItem(position,false);} else if ( position > 5) { //末位之后,跳转到首位(1)mViewPager.setCurrentItem(1,false); //false:不显示跳转过程的动画position = 1;}}  }@Overrideprotected void onDestroy() {super.onDestroy();}}
mViewPager.setCurrentItem(1,false); //false:不显示跳转过程的动画

上面的代码只是一个简单的Demo,如果不将跳转动画去掉的话,首尾页跳转的时候过渡效果会很不自然。

ViewPager实现左右无限循环效果相关推荐

  1. android双重for循环,Android实现ViewPager无限循环效果(二)

    本文实例为大家分享了Android实现ViewPager无限循环效果的第二种方式,供大家参考,具体内容如下 原理:在Adapter中将getCount设置为无限大 package com.xiaoma ...

  2. Android TV 3D卡片无限循环效果

    TV 3D卡片无限循环效果 ##前言 需求:实现3个卡片实现无限循环效果:1-2-3-1-2-3-1-,而且要实现3D效果:中间突出,两侧呈角度显示 Viewpager实现方式 (1) LoopVie ...

  3. android星星爆炸效果图,Android_Android仿开心消消乐大树星星无限循环效果,啥都不说先上效果图,这个是 - phpStudy...

    Android仿开心消消乐大树星星无限循环效果 啥都不说先上效果图,这个是我项目里的效果: 下面的是我抽取出来的 demo 适配啥的我基本上都做好了没做其他的 ok 下面 说一下思路把 首先 说一下原 ...

  4. Android之ViewPager实现图片无限循环轮播

    很久没有写博客了,之前花时间写了一个Viewpager实现的无限图片轮播,个人感觉还是很好用的QAQ,源码和思路都还算清晰 实现的效果图如下: 这里要补充一下,在这个项目中我把图片轮播写进了一个Vie ...

  5. android 星星流逝动画,Android仿开心消消乐大树星星无限循环效果

    啥都不说先上效果图,这个是我项目里的效果: 下面的是我抽取出来的 demo 适配啥的我基本上都做好了没做其他的 ok 下面 说一下思路把 首先 说一下原理 我是使用bitmap 创建两张图 一开始的时 ...

  6. android开发实例之viewpager无限循环+自动滚动,Android ViewPager实现无限循环的实例...

    Android ViewPager实现无限循环的实例 ViewPager自身并不支持左右无限循环的功能,这里就提供一种方案让Android ViewPager实现左右无限循环的功能,这里记录下: 用于 ...

  7. 实现一个横向无限循环滚动的单行弹幕效果

    本期将带领大家实现一个这样的效果,支持无限循环的单行弹幕效果. 实现思路分析 要实现上面的效果,我们先拆分下实现要素: 1.弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求) 2 ...

  8. 在线直播系统源码,横向无限循环滚动的单行弹幕效果

    在线直播系统源码,横向无限循环滚动的单行弹幕效果实现的相关代码 实现思路分析 要实现上面的效果,我们先拆分下实现要素: 1.弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固定的(设计要求) 2 ...

  9. 手把手带你用viewpager实现gallary效果,外加无限循环,自动轮播

    手把手带你用viewpager实现gallary效果,外加无限循环,自动轮播 效果图:图很丑,各位看官且按需更改. 主要功能: ①Gallary样式 ②无限轮播 ③自动轮播和手势操作间冲突解决 提前说 ...

最新文章

  1. Oracle 常用sql整理
  2. struts.xml配置文件(二)
  3. centos关闭php服务,linux(centos)防火墙的开启与关闭的方法
  4. 大屏监控系统实战(4)-如何将SpringBoot+Vue前后端分离项目一次打包为一个Jar包运行?
  5. 80-10-020-原理-Java NIO-HeapByteBuffer
  6. 杭电4535吉哥系列故事——礼尚往来
  7. 软件工程专业指导4(方法)
  8. 解决Selection executes are supported only in the DbVisualizer Personal edition
  9. 【第一讲】APK应用程序的解包、修改、编辑、打包及应用(转)
  10. 《Labeled Data Generation with Inexact Supervision》 KDD-2021 论文阅读
  11. MA5671 上海联通配置指南
  12. 01-Java中的集合
  13. 识别 零极点 matlab,matlab计算零极点分布图
  14. 编写文件服务器,编写服务器的头文件
  15. html 93c,对93c46编程
  16. 规范化理论:范式等级
  17. MindSpore实现语音指令识别(迁移tf入门教程)
  18. 模电学习笔记(上交郑老师)25.深度负反馈放大电路分析
  19. 惠普触控板使用指南_Windows10触控板的正确使用方法
  20. 为什么你的同龄人在抛弃你?还要等着被谁抛弃?

热门文章

  1. WPF工控组态软件之温度计
  2. 09_20_第七阶段:微服务开发||01-SpringBoot||19分布式Dubbo和Zookeeper【观看狂神随笔】
  3. loaderruner
  4. f460是多少兆的 zxhn_一个大不同的中兴光猫——ZXHN F460
  5. Adaboost算法的初步理解
  6. 达梦物化视图概念及简单示例
  7. 金融银行软件测试超大型攻略,最受欢迎的金融银行大揭 秘附面试题
  8. 数据结构(C语言严版)总结
  9. 仓库码放要求_库房货品堆码管理规定,货品码放层数、高度、间距标准
  10. throw语句以及throw “error“ 和 throw new Error(“error“)的区别