使用ViewPager实现android软件使用向导的功能
现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了。
先看下效果图:
首先需要一个布局文件,是FlameLayout组成的,里面包含了一个ViewPager和一个RelativeLayout,RelativeLayout里面是一个LinearLayout,LinearLayout里面是准备放ImageView,动态添加。
布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/guidePages" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom"> <LinearLayout android:id="@+id/viewGroup" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center" android:layout_marginBottom="30dip"> </LinearLayout> </RelativeLayout> </FrameLayout>
另外我们需要4个布局文件,就是向导要显示的图片,每个布局文件是一页,每个布局文件里面都是一个ImageView。如下所示:
布局文件一:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ImageView 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" 10 android:src="@drawable/feature_guide_0"/>" 11 12 </LinearLayout>
布局文件二:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ImageView 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" 10 android:src="@drawable/feature_guide_1"/> 11 12 </LinearLayout>
布局文件三:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ImageView 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" 10 android:src="@drawable/feature_guide_2"/>" 11 12 </LinearLayout>
布局文件四:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ImageView 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" 10 android:src="@drawable/feature_guide_3"/>" 11 12 </LinearLayout>
然后在代码里面加载这4个布局文件和主布局文件:
Activity代码:
1 package com.alex.helloworld; 2 3 import java.util.ArrayList; 4 5 import android.app.Activity; 6 import android.os.Bundle; 7 import android.os.Parcelable; 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.LayoutInflater; 12 import android.view.View; 13 import android.view.ViewGroup.LayoutParams; 14 import android.view.Window; 15 import android.widget.FrameLayout; 16 import android.widget.ImageView; 17 import android.widget.LinearLayout; 18 19 public class HelloWord2 extends Activity implements OnPageChangeListener { 20 21 private ArrayList<View> mPageViews; 22 private LayoutInflater mInflater; 23 private LinearLayout mGroups; 24 private FrameLayout mMain; 25 private ViewPager mViewPager; 26 private ImageView[] mImageViews; 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 requestWindowFeature(Window.FEATURE_NO_TITLE); 32 mInflater = LayoutInflater.from(this); 33 mPageViews = new ArrayList<View>(); 34 mPageViews.add(mInflater.inflate(R.layout.item_0, null)); 35 mPageViews.add(mInflater.inflate(R.layout.item_1, null)); 36 mPageViews.add(mInflater.inflate(R.layout.item_2, null)); 37 mPageViews.add(mInflater.inflate(R.layout.item_3, null)); 38 39 mMain = (FrameLayout) mInflater.inflate(R.layout.hello2, null); 40 mGroups = (LinearLayout) mMain.findViewById(R.id.viewGroup); 41 mViewPager = (ViewPager) mMain.findViewById(R.id.guidePages); 42 mImageViews = new ImageView[mPageViews.size()]; 43 44 for(int i=0; i<mPageViews.size(); i++) { 45 ImageView iv = new ImageView(this); 46 iv.setLayoutParams(new LayoutParams(20, 20)); 47 mImageViews[i] = iv; 48 if(i == 0) { 49 mImageViews[i].setBackgroundResource(R.drawable.page_indicator_focused); 50 } else { 51 mImageViews[i].setBackgroundResource(R.drawable.page_indicator); 52 } 53 mGroups.addView(mImageViews[i]); 54 } 55 mViewPager.setAdapter(mPageAdapter); 56 mViewPager.setOnPageChangeListener(this); 57 setContentView(mMain); 58 } 59 60 private PagerAdapter mPageAdapter = new PagerAdapter() { 61 62 @Override 63 public void startUpdate(View arg0) { 64 65 } 66 67 @Override 68 public Parcelable saveState() { 69 return null; 70 } 71 72 @Override 73 public void restoreState(Parcelable arg0, ClassLoader arg1) { 74 75 } 76 77 @Override 78 public boolean isViewFromObject(View arg0, Object arg1) { 79 return arg0 == arg1; 80 } 81 82 @Override 83 public Object instantiateItem(View arg0, int arg1) { 84 ((ViewPager)arg0).addView(mPageViews.get(arg1)); 85 return mPageViews.get(arg1); 86 } 87 88 @Override 89 public int getCount() { 90 return mPageViews.size(); 91 } 92 93 @Override 94 public void finishUpdate(View arg0) { 95 96 } 97 98 @Override 99 public void destroyItem(View arg0, int arg1, Object arg2) { 100 ((ViewPager)arg0).removeView(mPageViews.get(arg1)); 101 } 102 }; 103 104 @Override 105 public void onPageScrolled(int position, float positionOffset, 106 int positionOffsetPixels) { 107 108 } 109 110 @Override 111 public void onPageSelected(int position) { 112 for(int i=0; i<mPageViews.size(); i++) { 113 mImageViews[position].setBackgroundResource(R.drawable.page_indicator_focused); 114 if(position != i) { 115 mImageViews[i].setBackgroundResource(R.drawable.page_indicator); 116 } 117 } 118 } 119 120 @Override 121 public void onPageScrollStateChanged(int state) { 122 123 } 124 }
首先从LayoutInflater里面加载4个要显示的布局和主布局文件。
然后把布局文件作为View放到一个ArrayList里面。
然后从主布局里面找到ViewPager和LinearLayout,ViewPager用来装载4个布局文件,LinearLayout用来装载4个提示图标。
然后新建4个ImageView,并设置对应的背景,然后作为View添加到LinearLayout里面去。
然后给ViewPager设置Adapter,设置onPageChangeListener。
Adapter里面要设置getCount,就是页面的个数,我们这里是4个,就设置4;
同时在instantiateItem里面讲对应的页面add进去,并返回对应的页面。
在destroyItem的时候讲页面remove掉。
在选择页面的方法里面onPageSelected里面设置选中图标的背景。
就这些。
下载源代码:请点我!