這2天事情比較多,都沒時間更新博客,趁週末,繼續繼續~java
今天來說個比較新潮的組件——ViewPagerandroid
什麼是ViewPager?數組
ViewPager是安卓3.0以後提供的新特性,繼承自ViewGroup,專門用以實現左右滑動切換View的效果。微信
若是想向下兼容就必需要android-support-v4.jar這個包的支持,這是一個來自google提供的一個附加包。app
通俗點來說,就是如今市面上大多數app,安裝完第一次打開軟件會出現的一個左右滑動的引導界面。ide
先來看下效果圖:佈局
這是一個仿微信的引導界面,圖是我摳來的ui
實現功能:this
可以左右滑動頁面,下面對應的小圓圈點順帶着走,也能夠對小圓點進行點擊跳轉(有些人可能會採用把小圓點寫死,直接畫在界面上的背景圖,其實這個是個很很差的習慣,太不靈活,一旦改動起來,很很差維護)google
其實要實現這種效果並不難,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種:
一、經過XML配置文件,把對應的頁面設置好,而後把xml配置文件轉換成view對象並載入這個集合裏
二、經過代碼動態生成,把生成的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/本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,往後必有一番做爲!旁邊有「推薦」二字,你就順手把它點了吧,相得準,我分文不收;相不許,你也好回來找我!