要加入android-support-v4.jar这个jar包(2.3版本之前)
效果图:
主页面的布局
1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <android.support.v4.view.ViewPager 8 android:id="@+id/viewPager" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" /> 11 12 <RelativeLayout 13 android:layout_width="fill_parent" 14 android:layout_height="wrap_content" 15 android:orientation="vertical" > 16 17 <LinearLayout 18 android:id="@+id/viewGroup" 19 android:layout_width="fill_parent" 20 android:layout_height="wrap_content" 21 android:layout_alignParentBottom="true" 22 android:layout_marginBottom="30dp" 23 android:gravity="center_horizontal" 24 android:orientation="horizontal" > 25 </LinearLayout> 26 </RelativeLayout> 27 28 </FrameLayout>
子页面的布局,inem1.xml到item5.xml 都可以用下面的代码
1 <?xml version="1.0" encoding="UTF-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <ImageView 8 android:layout_width="fill_parent" 9 android:layout_height="fill_parent" 10 android:background="@drawable/guide01" > 11 </ImageView> 12 13 </LinearLayout>
最后是核心代码:
1 import java.util.ArrayList; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 import android.os.Parcelable; 7 import android.support.v4.view.PagerAdapter; 8 import android.support.v4.view.ViewPager; 9 import android.support.v4.view.ViewPager.OnPageChangeListener; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.ViewGroup; 13 import android.view.ViewGroup.LayoutParams; 14 import android.view.Window; 15 import android.widget.ImageView; 16 17 public class MainActivity extends Activity { 18 ViewPager viewPager; 19 ArrayList<View> list; 20 ViewGroup main, group; 21 ImageView imageView; 22 ImageView[] imageViews; 23 24 @Override 25 public void onCreate(Bundle savedInstanceState) { 26 super.onCreate(savedInstanceState); 27 this.requestWindowFeature(Window.FEATURE_NO_TITLE); 28 LayoutInflater inflater = getLayoutInflater(); 29 list = new ArrayList<View>(); 30 list.add(inflater.inflate(R.layout.item1, null)); 31 list.add(inflater.inflate(R.layout.item2, null)); 32 list.add(inflater.inflate(R.layout.item3, null)); 33 list.add(inflater.inflate(R.layout.item4, null)); 34 list.add(inflater.inflate(R.layout.item5, null)); 35 36 imageViews = new ImageView[list.size()]; 37 ViewGroup main = (ViewGroup) inflater.inflate(R.layout.main, null); 38 // group是R.layou.main中的负责包裹小圆点的LinearLayout. 39 ViewGroup group = (ViewGroup) main.findViewById(R.id.viewGroup); 40 41 viewPager = (ViewPager) main.findViewById(R.id.viewPager); 42 43 for (int i = 0; i < list.size(); i++) { 44 imageView = new ImageView(MainActivity.this); 45 imageView.setLayoutParams(new LayoutParams(10,10)); 46 imageView.setPadding(10, 0, 10, 0); 47 imageViews[i] = imageView; 48 if (i == 0) { 49 // 默认进入程序后第一张图片被选中; 50 imageViews[i].setBackgroundResource(R.drawable.guide_dot_white); 51 } else { 52 imageViews[i].setBackgroundResource(R.drawable.guide_dot_black); 53 } 54 group.addView(imageView); 55 } 56 57 setContentView(main); 58 59 viewPager.setAdapter(new MyAdapter()); 60 viewPager.setOnPageChangeListener(new MyListener()); 61 } 62 63 class MyAdapter extends PagerAdapter { 64 65 @Override 66 public int getCount() { 67 return list.size(); 68 } 69 70 @Override 71 public boolean isViewFromObject(View arg0, Object arg1) { 72 return arg0 == arg1; 73 } 74 75 @Override 76 public int getItemPosition(Object object) { 77 // TODO Auto-generated method stub 78 return super.getItemPosition(object); 79 } 80 81 @Override 82 public void destroyItem(View arg0, int arg1, Object arg2) { 83 // TODO Auto-generated method stub 84 ((ViewPager) arg0).removeView(list.get(arg1)); 85 } 86 87 @Override 88 public Object instantiateItem(View arg0, int arg1) { 89 // TODO Auto-generated method stub 90 ((ViewPager) arg0).addView(list.get(arg1)); 91 return list.get(arg1); 92 } 93 94 @Override 95 public void restoreState(Parcelable arg0, ClassLoader arg1) { 96 // TODO Auto-generated method stub 97 98 } 99 100 @Override 101 public Parcelable saveState() { 102 // TODO Auto-generated method stub 103 return null; 104 } 105 106 @Override 107 public void startUpdate(View arg0) { 108 // TODO Auto-generated method stub 109 110 } 111 112 @Override 113 public void finishUpdate(View arg0) { 114 // TODO Auto-generated method stub 115 116 } 117 } 118 119 class MyListener implements OnPageChangeListener { 120 121 @Override 122 public void onPageScrollStateChanged(int arg0) { 123 // TODO Auto-generated method stub 124 125 } 126 127 @Override 128 public void onPageScrolled(int arg0, float arg1, int arg2) { 129 // TODO Auto-generated method stub 130 131 } 132 133 @Override 134 public void onPageSelected(int arg0) { 135 for (int i = 0; i < imageViews.length; i++) { 136 imageViews[arg0] 137 .setBackgroundResource(R.drawable.guide_dot_white); 138 if (arg0 != i) { 139 imageViews[i] 140 .setBackgroundResource(R.drawable.guide_dot_black); 141 } 142 } 143 144 } 145 146 } 147 }
以上原帖http://blog.csdn.net/wangkuifeng0118/article/details/7388166
ViewPager的onPageChangeListener里面的一些方法参数:
onPageSelected(int arg0){
}
arg0是表示你当前选中的页面,这事件是在你页面跳转完毕的时候调用的。
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
} arg0 ==1的时候表示正在滑动,arg0==2的时候表示滑动完毕了,arg0==0的时候表示什么都没做,就是停在那。
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}表示在前一个页面滑动到后一个页面的时候,在前一个页面滑动前调用的方法。
以上来源:http://www.cnblogs.com/simpleceo/archive/2012/04/14/2447100.html
ViewPager实现左右循环滑动。
有两处关键代码,第一处,生成用于PagerAdapter的View列表:
1 private List<View> initViews(){ 2 List<View> listViews = new ArrayList<View>(); 3 4 MyView v1 = new MyView(this, R.layout.view1); 5 MyView v2 = new MyView(this, R.layout.view2); 6 MyView v3 = new MyView(this, R.layout.view3); 7 8 // 循环滑动:头部添加一个和原尾部相同的view,尾部添加一个和原头部相同的view 9 MyView v0 = new MyView(this, R.layout.view3); 10 MyView v4 = new MyView(this, R.layout.view1); 11 12 listViews.add(v0); 13 listViews.add(v1); 14 listViews.add(v2); 15 listViews.add(v3); 16 listViews.add(v4); 17 18 return listViews; 19 }
第二处,重写OnPageChangeListener的onPageSelected方法,当前页为0时改为倒数第二个,也就是实际需要的最后一个view;当前页为最后一个时改为第二个,即实际上的第一个view:
1 public void onPageSelected(int arg0) { 2 if(arg0 == 0){ 3 mPager.setCurrentItem(listViews.size() - 2, false); 4 } else if(arg0 == listViews.size() - 1){ 5 mPager.setCurrentItem(1, false); 6 } 7 }
不要忘记在初始化时设置当前view为1,而不是默认的0:
1 mPager.setCurrentItem(1);
ViewPager页面拖动到最前或最后的时候回弹效果
如果不想循环,但是想左右两头仍可以滑动,松开手后仍保持在原来的view,可以做如下改动。
首先,头尾各添加两个空view:
1 private List<View> initViews(){ 2 ...... 3 listViews.add(new View(this)); 4 listViews.add(v1); 5 listViews.add(v2); 6 listViews.add(v3); 7 listViews.add(new View(this)); 8 ...... 9 }
然后,OnPageChangeListener的onPageSelected方法改为下面的形式:
1 public void onPageSelected(int arg0) { 2 if(arg0 == 0){ 3 mPager.setCurrentItem(1, false); 4 } else if(arg0 == listViews.size() - 1){ 5 mPager.setCurrentItem(listViews.size() - 2, false); 6 } 7 }
以上来源:http://blog.csdn.net/javasecret/article/details/7843726