ViewPager实现左右无限循环效果

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

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

首先还是布局文件:

 

[html]  view plain  copy
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <android.support.v4.view.ViewPager  
  7.         android:id="@+id/viewpager"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent" >  
  10.     </android.support.v4.view.ViewPager>  
  11.   
  12.     <LinearLayout  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_alignBottom="@id/viewpager"  
  16.         android:background="#33000000"  
  17.         android:orientation="vertical"  
  18.         android:padding="5dip" >  
  19.   
  20.         <TextView  
  21.             android:id="@+id/tv_image_description"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:layout_gravity="center_horizontal"  
  25.             android:text="第一个引导页面"  
  26.             android:textColor="@android:color/white"  
  27.             android:textSize="14sp" />  
  28.   
  29.         <LinearLayout  
  30.             android:id="@+id/ll_points"  
  31.             android:layout_width="wrap_content"  
  32.             android:layout_height="wrap_content"  
  33.             android:layout_marginTop="5dip"  
  34.             android:layout_gravity="center_horizontal"  
  35.             android:orientation="horizontal" >  
  36.         </LinearLayout>  
  37.     </LinearLayout>  
  38.   
  39. </RelativeLayout>  


接下来是MainActivity:

 

 

[java]  view plain  copy
 
  1. package com.example.viewpagertest;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.support.v4.view.PagerAdapter;  
  9. import android.support.v4.view.ViewPager;  
  10. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.widget.ImageView;  
  14.   
  15. public class MainActivity extends Activity implements OnPageChangeListener {  
  16.   
  17.     private List<ImageView> imageViewList;  
  18.     private ViewPager mViewPager;  
  19.   
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setView();  
  25.         initView();  
  26.     }  
  27.   
  28.     public void setView() {  
  29.         setContentView(R.layout.activity_splash_viewpager);  
  30.   
  31.     }  
  32.   
  33.     public void initView() {  
  34.         mViewPager = (ViewPager) findViewById(R.id.viewpager);  
  35.         prepareData();  
  36.           
  37.         ViewPagerAdapter adapter = new ViewPagerAdapter();  
  38.         mViewPager.setAdapter(adapter);  
  39.         mViewPager.setOnPageChangeListener(this);  
  40.     }  
  41.       
  42.      private void prepareData() {  
  43.             imageViewList = new ArrayList<ImageView>();  
  44.             int[] imageResIDs = getImageResIDs();  
  45.             ImageView iv;  
  46.             for (int i = 0; i < imageResIDs.length; i++) {  
  47.                 iv = new ImageView(this);  
  48.                 iv.setBackgroundResource(imageResIDs[i]);  
  49.                 imageViewList.add(iv);  
  50.                   
  51.             }  
  52.         }  
  53.           
  54.      /** 
  55.       * 在此处本来是5张图片,现在在数组首尾各加了一张图 
  56.       * @return 
  57.       */  
  58.         private int[] getImageResIDs() {  
  59.             return new int[]{  
  60.                     R.drawable.pic_02,  
  61.                     R.drawable.bg1,  
  62.                     R.drawable.bg2,  
  63.                     R.drawable.bg3,  
  64.                     R.drawable.pic_01,  
  65.                     R.drawable.pic_02,  
  66.                     R.drawable.bg1,  
  67.   
  68.             };  
  69.         }  
  70.           
  71.         class ViewPagerAdapter extends PagerAdapter {  
  72.   
  73.             @Override  
  74.             public int getCount() {  
  75.                 return imageViewList.size();  
  76.             }  
  77.   
  78.             /** 
  79.              * 判断出去的view是否等于进来的view 如果为true直接复用 
  80.              */  
  81.             @Override  
  82.             public boolean isViewFromObject(View arg0, Object arg1) {  
  83.                 return arg0 == arg1;  
  84.             }  
  85.   
  86.             /** 
  87.              * 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来就是position 
  88.              */  
  89.             @Override  
  90.             public void destroyItem(ViewGroup container, int position, Object object) {  
  91.                 container.removeView(imageViewList.get(position));  
  92.             }  
  93.   
  94.             /** 
  95.              * 创建一个view 
  96.              */  
  97.             @Override  
  98.             public Object instantiateItem(ViewGroup container, int position) {  
  99.                 container.addView(imageViewList.get(position));  
  100.                 return imageViewList.get(position);  
  101.             }  
  102.         }  
  103.   
  104.         @Override  
  105.         public void onPageScrollStateChanged(int arg0) {  
  106.               
  107.         }  
  108.   
  109.         @Override  
  110.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
  111.               
  112.         }  
  113.   
  114.         @Override  
  115.         public void onPageSelected(int position) {  
  116.             if ( imageViewList.size() > 1) { //多于1,才会循环跳转  
  117.                 if ( position < 1) { //首位之前,跳转到末尾(N)  
  118.                     position = 5;   
  119.                     mViewPager.setCurrentItem(position,false);  
  120.                 } else if ( position > 5) { //末位之后,跳转到首位(1)  
  121.                     mViewPager.setCurrentItem(1,false); //false:不显示跳转过程的动画  
  122.                     position = 1;  
  123.                 }  
  124.             }     
  125.         }  
  126.   
  127.     @Override  
  128.     protected void onDestroy() {  
  129.         super.onDestroy();  
  130.     }  
  131.   
  132. }  
[java]  view plain  copy
 
  1. mViewPager.setCurrentItem(1,false); //false:不显示跳转过程的动画  

 

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

猜你喜欢

转载自ch-kexin.iteye.com/blog/2294102