安卓開發筆記——ViewPager組件(仿微信引導界面)


這2天事情比較多,都沒時間更新博客,趁周末,繼續繼續~

今天來講個比較新潮的組件——ViewPager

 

什么是ViewPager?

ViewPager是安卓3.0之后提供的新特性,繼承自ViewGroup,專門用以實現左右滑動切換View的效果。

如果想向下兼容就必須要android-support-v4.jar這個包的支持,這是一個來自google提供的一個附加包。

通俗點來講,就是現在市面上大多數app,安裝完第一次打開軟件會出現的一個左右滑動的引導界面。

 

先來看下效果圖:

 

這是一個仿微信的引導界面,圖是我摳來的

實現功能:

能夠左右滑動頁面,下面對應的小圓圈點順帶着走,也可以對小圓點進行點擊跳轉(有些人可能會采用把小圓點寫死,直接畫在界面上的背景圖,其實這個是個很不好的習慣,太不靈活,一旦改動起來,很不好維護)

 

其實要實現這種效果並不難,ViewPager這個控件和其他常見控件的實現方式大致相同(比如:ListView)

步驟:聲明實例化控件->設置數據源->配置適配器->綁定適配器->(添加監聽)

 

聲明控件:

由於該類存在於Google的兼容包里面,所以在引用時記得在BuilldPath中加入“android-support-v4.jar”

1     <android.support.v4.view.ViewPager
2         android:id="@+id/viewpager"
3         android:layout_width="fill_parent"
4         android:layout_height="fill_parent" />

數據源:

這里的是數據源是一個存放着View對象的集合:

實現方式有2種:

1、通過XML配置文件,把對應的頁面設置好,然后把xml配置文件轉換成view對象並載入這個集合里

2、通過代碼動態生成,把生成的View對象載入到集合里。

 

適配器:

我們需要去繼承PagerAdapter類,並覆寫相對應的方法(在下面代碼部分會詳細說)

下面提供必須實現的,最基本的幾個方法:

 1     @Override
 2     public int getCount() {//返回頁面數量
 3         return 0;
 4     }
 5 
 6     @Override
 7     public boolean isViewFromObject(View arg0, Object arg1) {//判斷是否是view對象
 8         return false;
 9     }
10     
11     @Override
12     public Object instantiateItem(View container, int position) {//實例化一個頁面
13         return super.instantiateItem(container, position);
14     }
15     
16     @Override
17     public void destroyItem(View container, int position, Object object) {//銷毀一個頁面
18         super.destroyItem(container, position, object);
19     }

當然還可以設置更多樣式,比如給ViewPager的每個頁面都加入標題等,這里就不再多說,大家自己翻看API吧。

 

直接上代碼吧,本段代碼是采用XML布局文件靜態生成view對象的,其中有一段注釋是提供代碼動態生成view的方法,至於用哪個,看個人喜好了。

MainActivity.java(主程序類)

  1 package com.example.wx_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.ViewPager;
  9 import android.support.v4.view.ViewPager.OnPageChangeListener;
 10 import android.view.View;
 11 import android.view.View.OnClickListener;
 12 import android.widget.Button;
 13 import android.widget.ImageView;
 14 import android.widget.LinearLayout;
 15 import android.widget.Toast;
 16 
 17 public class MainActivity extends Activity implements OnPageChangeListener,OnClickListener{
 18     
 19     private ViewPager viewPager;
 20     private List<View> viewList;
 21     //private int images[]={R.drawable.v1,R.drawable.v2,R.drawable.v3,R.drawable.v4};//導航圖片資源
 22     private View view1, view2, view3, view4;
 23     private ImageView points[];//存放小圓圈數組 
 24     
 25     private int currentIndex=0;//當前頁面,默認首頁
 26     
 27     private Button startButton;
 28     
 29 
 30     @Override
 31     protected void onCreate(Bundle savedInstanceState) {
 32         super.onCreate(savedInstanceState);
 33         setContentView(R.layout.activity_main);
 34         initViewPager();//初始化ViewPager對象
 35         initPoint();//初始化導航小圓點
 36     }
 37 
 38     private void initPoint() {
 39         LinearLayout  linearLayout=(LinearLayout) findViewById(R.id.ll);
 40         points=new ImageView[4];
 41         for(int i=0;i<points.length;i++){
 42             points[i]=(ImageView) linearLayout.getChildAt(i);//遍歷LinearLayout下的所有ImageView子節點
 43             points[i].setEnabled(true);//設置當前狀態為允許(可點,灰色)
 44             //設置點擊監聽
 45             points[i].setOnClickListener(this);
 46             
 47             //額外設置一個標識符,以便點擊小圓點時跳轉對應頁面
 48             points[i].setTag(i);//標識符與圓點順序一致
 49         }
 50         
 51         currentIndex=0;
 52         points[currentIndex].setEnabled(false);//設置首頁為當前頁(小點着色,藍色)
 53         
 54         
 55         
 56     }
 57 
 58     private void initViewPager() {
 59         viewPager=(ViewPager) findViewById(R.id.viewpager);//取得ViewPager實例
 60         viewList=new ArrayList<View>();//實例化list集合
 61         
 62 /*        用代碼的動態添加View
 63         //添加對應的view進入集合(數據源)
 64         for(int i=0;i<images.length;i++){
 65             ImageView imageView=new ImageView(MainActivity.this);
 66             imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
 67             imageView.setScaleType(ScaleType.FIT_XY);//設置縮放樣式
 68             imageView.setImageResource(images[i]);
 69             viewList.add(imageView);
 70         }
 71 */
 72         
 73         //用xml靜態添加view
 74         view1=View.inflate(MainActivity.this, R.layout.view1, null);
 75         view2=View.inflate(MainActivity.this, R.layout.view2, null);
 76         view3=View.inflate(MainActivity.this, R.layout.view3, null);
 77         view4=View.inflate(MainActivity.this, R.layout.view4, null);
 78         viewList.add(view1);
 79         viewList.add(view2);
 80         viewList.add(view3);
 81         viewList.add(view4);
 82          
 83 
 84         
 85         //設置適配器
 86         ImageAdapter adapter=new ImageAdapter(viewList);
 87         
 88         //綁定適配器
 89         viewPager.setAdapter(adapter);
 90         
 91         //設置頁卡切換監聽
 92         viewPager.setOnPageChangeListener(this);
 93         
 94     }
 95 
 96     @Override
 97     public void onPageScrollStateChanged(int arg0) {
 98         
 99     }
100 
101     @Override
102     public void onPageScrolled(int arg0, float arg1, int arg2) {
103         
104     }
105 
106     @Override
107     public void onPageSelected(int position ) {//當前頁卡被選擇時,position為當前頁數
108         
109         if(position==3){//由於進入微信這個按鈕在第4個頁面(view)才會出現,如果一開始就加載這個按鈕監聽,就導致空指針異常
110                 startButton=(Button) findViewById(R.id.startbutton);
111                 startButton.setOnClickListener(new OnClickListener() {//匿名內部類,區分小圓圈的點擊事件    
112                     
113                 @Override
114                 public void onClick(View v) {
115                     Toast.makeText(MainActivity.this, "歡迎進入微信世界", Toast.LENGTH_SHORT).show();
116                 }
117             });
118         }
119         points[position].setEnabled(false);//不可點
120         points[currentIndex].setEnabled(true);//恢復之前頁面狀態
121         currentIndex=position;
122         
123     }
124 
125     @Override
126     public void onClick(View v) {
127         //利用剛設置的標識符跳轉頁面
128         //Log.i("tuzi",v.getTag()+"");
129         viewPager.setCurrentItem((int) v.getTag());
130         
131     }
132 
133 }

 

ImageAdapter.java(適配器類)

 1 package com.example.wx_viewpagertest;
 2 
 3 import java.util.List;
 4 
 5 import android.support.v4.view.PagerAdapter;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 
 9 public class ImageAdapter extends PagerAdapter {
10     private List<View> list;
11 
12     public ImageAdapter(List<View> list) {// 利用構造器接收list集合參數
13         this.list = list;
14     }
15 
16     @Override
17     public int getCount() {// 返回頁卡數量
18         if (list.size() != 0) {
19             return list.size();
20         }
21         return 0;
22     }
23 
24     @Override
25     public boolean isViewFromObject(View arg0, Object arg1) {//判斷是否為view對象
26         return arg0==arg1;//官方demo給出的建議寫法
27     }
28     
29     @Override
30     public Object instantiateItem(ViewGroup container, int position) {//實例化一個頁卡,view對象存放在ViewGroup里
31         container.addView(list.get(position));
32         return list.get(position);
33     }
34     
35     @Override
36     public void destroyItem(ViewGroup container, int position, Object object) {//銷毀一個頁卡
37         container.removeView(list.get(position));
38     }
39 
40 }

 

XML布局文件這里就不都貼出來了,就是簡簡單單的設置圖片,文字按鈕等

只貼其中比較特別的view:

 

主界面xml(activity_main.xml):

 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     tools:context="com.example.wx_viewpagertest.MainActivity" >
 6 
 7     <android.support.v4.view.ViewPager
 8         android:id="@+id/viewpager"
 9         android:layout_width="fill_parent"
10         android:layout_height="fill_parent" />
11 
12     <LinearLayout
13         android:id="@+id/ll"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:layout_alignParentBottom="true"
17         android:layout_centerHorizontal="true"
18         android:layout_marginBottom="20dp"
19         android:orientation="horizontal" >
20 
21         <ImageView
22             android:id="@+id/iv1"
23             android:layout_width="wrap_content"
24             android:layout_height="wrap_content"
25             android:layout_gravity="center_vertical"
26             android:clickable="true"
27             android:padding="25dp"
28             android:src="@drawable/point_selector" />
29 
30         <ImageView
31             android:id="@+id/iv2"
32             android:layout_width="wrap_content"
33             android:layout_height="wrap_content"
34             android:layout_gravity="center_vertical"
35             android:clickable="true"
36             android:padding="25dp"
37             android:src="@drawable/point_selector" />
38 
39         <ImageView
40             android:id="@+id/iv3"
41             android:layout_width="wrap_content"
42             android:layout_height="wrap_content"
43             android:layout_gravity="center_vertical"
44             android:clickable="true"
45             android:padding="25dp"
46             android:src="@drawable/point_selector" />
47 
48         <ImageView
49             android:id="@+id/iv4"
50             android:layout_width="wrap_content"
51             android:layout_height="wrap_content"
52             android:layout_gravity="center_vertical"
53             android:clickable="true"
54             android:padding="25dp"
55             android:src="@drawable/point_selector" />
56     </LinearLayout>
57 
58 </RelativeLayout>

 

 

最后一個頁面帶進入按鈕的xml(view4.xml):

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:background="@drawable/v4"
 6     android:orientation="vertical" >
 7 
 8     <TextView
 9         android:id="@+id/starttext"
10         android:layout_width="fill_parent"
11         android:layout_height="wrap_content"
12         android:layout_alignParentTop="true"
13         android:layout_centerHorizontal="true"
14         android:gravity="center"
15         android:layout_marginTop="80dp"
16         android:text="微信,是一種生活方式"
17         android:textColor="@android:color/white"
18         android:textSize="20dp" />
19 
20     <Button
21         android:id="@+id/startbutton"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:layout_alignParentBottom="true"
25         android:layout_centerHorizontal="true"
26         android:layout_marginBottom="80dp"
27         android:background="@drawable/startbutton_selector"
28         android:text="@string/start"
29         android:textColor="@android:color/white"
30         android:textSize="18dp" />
31     
32 
33 
34 </RelativeLayout>

 

這里還有個選擇器,自定義小圓圈和Button按鈕樣式:

小圓圈:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <selector xmlns:android="http://schemas.android.com/apk/res/android" >
 3     
 4     <item 
 5         android:state_enabled="true" android:drawable="@drawable/v_point_nor"
 6         ></item>
 7     
 8     <item 
 9          android:state_enabled="false" android:drawable="@drawable/v_point_pre"
10         ></item>
11 
12 </selector>

自定義按鈕:

1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3     <item android:state_enabled="true" android:state_pressed="true"
4         android:drawable="@drawable/v_btn_pressed" />    
5     <item android:state_enabled="true" android:drawable="@drawable/v_btn_nor" />  
6 </selector>

 

 

好了,核心代碼都給出了,注釋已經很業界良心了~ See you!

 

作者:Balla_兔子
出處:http://www.cnblogs.com/lichenwei/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得准,我分文不收;相不准,你也好回來找我!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM