0
点赞
收藏
分享

微信扫一扫

ViewPager实现左右无限循环效果


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

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

ViewPager实现左右无限循环效果_移动开发

首先还是布局文件:

 

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:

 

 

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. new ViewPagerAdapter();  
38.         mViewPager.setAdapter(adapter);  
39. this);  
40.     }  
41.       
42. private void prepareData() {  
43. new ArrayList<ImageView>();  
44. int[] imageResIDs = getImageResIDs();  
45.             ImageView iv;  
46. for (int i = 0; i < imageResIDs.length; i++) {  
47. 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. 5;   
119. false);  
120. else if ( position > 5) { //末位之后,跳转到首位(1)  
121. 1,false); //false:不显示跳转过程的动画  
122. 1;  
123.                 }  
124.             }     
125.         }  
126.   
127. @Override  
128. protected void onDestroy() {  
129. super.onDestroy();  
130.     }  
131.   
132. }


 

1. mViewPager.setCurrentItem(1,false); //false:不显示跳转过程的动画



 

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

 

举报

相关推荐

0 条评论