【转】android使用ViewPager实现多页面切换

要加入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

posted @ 2012-11-22 14:49  沙发土豆  阅读(935)  评论(0编辑  收藏  举报