ViewPager有两个用途:
一.ViewPager实现引导页
首先新建一个类用来承载ViewPager:该类继承自activity。使其成为主界面,
public class Guide extends Activity implements ViewPager.OnPageChangeListener{ private ViewPager viewPager; private ViewPagerAdapter myAdapter; private List<View> views; private ImageView[] dots; private int[] ids={R.id.iv1,R.id.iv2,R.id.iv3}; private Button btnWelcome; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.guide); init(); initDots(); } /** * 自定义初始化方法 * 加载所要切换的view */ private void init() { //使用layoutInflater来进行视图加载 LayoutInflater inflater = LayoutInflater.from(this); //对集合进行实例化操作 views = new ArrayList<View>(); //layoutInflater的使用,root传入null views.add(inflater.inflate(R.layout.one, null)); views.add(inflater.inflate(R.layout.two, null)); views.add(inflater.inflate(R.layout.three, null)); //实例化适配器 myAdapter = new ViewPagerAdapter(views, this); //加载viewPager对象 viewPager = (ViewPager) findViewById(R.id.viewpager); //ViewPager绑定适配器 viewPager.setAdapter(myAdapter); //查找id btnWelcome= (Button) views.get(2).findViewById(R.id.btnWelcome); btnWelcome.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Guide.this,MainActivity.class)); finish();//结束掉不需要的界面 } }); //设置页面回调,设置事件监听器 viewPager.addOnPageChangeListener(this); }想要使用 ViewPager对象必须使用PagerAdapter类来给他提供数据。
新建一个ViewPagerAdapter继承自PagerAdapter:
其实现方式和ListView比较相像
public class ViewPagerAdapter extends PagerAdapter{ private List<View> views;//使用List来承载所有的view private Context context;//上下文 /** * 构造函数和ListView的相像 * @param views * @param context */ ViewPagerAdapter(List<View> views,Context context){ this.views=views; this.context=context; } /** * view不需要是将其销毁 * 不要使用super构造方法 * @param container * @param position * @param object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager)container).removeView(views.get(position));//通过position来进行索引获取所要移除的view } /** * 加载view,类似与ListView的Adapter中的getView() * @param container * @param position * @return 当前的View */ @Override public Object instantiateItem(ViewGroup container, int position) { ((ViewPager)container).addView(views.get(position)); return views.get(position); } /** * 需复写的方法 * 返回view的数量 * @return */ @Override public int getCount() { return views.size(); } /** * 需复写的方法 * 判断当前的view是不是我们需要的对象 * @param view * @param object * @return */ @Override public boolean isViewFromObject(View view, Object object) { return view==object; } }
二.添加viewPager导航点
要求:给当前viewPager添加导航点,就是在下方有小点提示当前的位置和所有的页面数量。
<?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.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/viewpager"> </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/ll" android:layout_gravity="bottom" android:orientation="horizontal" android:gravity="center_horizontal"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv1" android:src="@drawable/login_point_selected"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv2" android:src="@drawable/login_point"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/iv3" android:src="@drawable/login_point"/> </LinearLayout> </FrameLayout>在Guider.java中添加如下代码:
/** * 导航点功能实现 */ private void initDots(){ dots=new ImageView[views.size()]; for (int i=0;i<views.size();i++){ dots[i]= (ImageView) findViewById(ids[i]); } } /** *当页面滑动时调用 * @param position * @param positionOffset * @param positionOffsetPixels */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /** *当新的页面被选择时调用 * 当前的页面被选中,将当前页面的图片换成亮的 * @param position */ @Override public void onPageSelected(int position) { for (int i=0;i<ids.length;i++){ if (i==position){ dots[i].setImageResource(R.drawable.login_point_selected); } else dots[i].setImageResource(R.drawable.login_point); } } /** * 滑动状态改变时进行调用 * @param state */ @Override public void onPageScrollStateChanged(int state) { } }
三.添加进入主界面按钮
当导航页滑动到最后一张时,需要出现进入主界面的按钮。
three.xml配置如下:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/guide_3"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/llb" android:layout_gravity="bottom" android:gravity="center_horizontal" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnWelcome" android:text="@string/login"/> </LinearLayout> </FrameLayout>功能代码实现:
//查找id btnWelcome= (Button) views.get(2).findViewById(R.id.btnWelcome); btnWelcome.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(Guide.this,MainActivity.class)); finish();//结束掉不需要的界面 } });
四.添加数据储存
真正的app只有在第一次使用时才会出现引导界面,所以得在程序中控制是否出现引导界面。
不能让主线程沉睡,所以使用Handler来进行沉睡,发送延迟消息来实现。
public class WelcomeAty extends Activity{ //是否是第一次进入程序 private static boolean isFirstIn=false; private static final int TIME=2000; private static final int GO_HOME=1000; private static final int GO_GUIDE=1001; private Handler mHandler=new Handler(){ /** * 使用handleMessage方法来决定跳转到哪个界面 * @param msg */ @Override public void handleMessage(Message msg) { switch (msg.what){ case GO_GUIDE: goGuide(); break; case GO_HOME: goHome(); break; } } }; /** * 程序主界面入口 * @param savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.welcome); init(); } /** * 进行是否是第一次进入应用的判断 */ private void init(){ //新建SharedPreferences对象 SharedPreferences sharedPreferences=getSharedPreferences("test",MODE_PRIVATE); //查询值,不存在赋值为true; isFirstIn=sharedPreferences.getBoolean("isFirstIn",true); //已经存在该对象,直接进入主界面 if(!isFirstIn){ mHandler.sendEmptyMessageDelayed(GO_HOME,TIME);//延时发送 }else { //不存在,进入引导界面 mHandler.sendEmptyMessageDelayed(GO_GUIDE, TIME); //存储内容 SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putBoolean("isFirstIn",false); editor.commit();//提交 } } /** *进入主界面 */ private void goHome(){ startActivity(new Intent(WelcomeAty.this,MainActivity.class)); finish(); } /** *进入引导界面 */ private void goGuide(){ startActivity(new Intent(WelcomeAty.this,Guide.class)); finish(); } }到此,成功的将一个完整的引导页功能实现了。
效果: