我理解的ViewPager是一个容器,跟ListView类似,需要跟适配器(PagerAdapter)搭配使用。
在布局文件中声明ViewPager十分简单,跟其他控件一样。
<android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="fill_parent" android:layout_height="fill_parent" />
然后在Activity里面获得。
mViewPager = (ViewPager)findViewById(R.id.viewPager);
ViewPager这个容器现在已经创建成功了,需要在界面上显示数据的话,就要将数据装入ViewPager容器。 通过方法setAdapter来实现数据装入。
定义一个类,继承PagerAdapter,重写里面的方法。
private class MyPagerAdapter extends PagerAdapter { @Override public int getCount() { return mGuideImageId.length; } @Override public Object instantiateItem(View arg0, int arg1) { ImageView view = new ImageView(MainActivity.this); view.setImageResource(mGuideImageId[arg1]); view.setScaleType(ScaleType.CENTER_CROP); if(arg1 == (mGuideImageId.length-1)){//最后一个页面监听点击事件,启动APP view.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this, AppActivity.class); startActivity(intent); finish(); } }); } ((ViewPager)arg0).addView(view); return view; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager)arg0).removeView((ImageView)arg2); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { } @Override public void finishUpdate(View arg0) { } }
其中比较重要的方法就是
getCount:该方法的返回值表示该ViewPager有几个页面
instantiateItem:初始化显示界面
destroyItem:移除显示界面
最后通过setAdapter方法将适配器与容器绑定
mViewPager.setAdapter(mMyPagerAdapter);
现在ViewPager已经能实现图片的切换,并且在最后一幅图片被点击时,会启动新的Activity!!!
现在要实现在每个界面的底部设置小圆点来表示ViewPager总共有几个界面和当前显示的是第几个界面。效果如下:
1 在布局文件里加上一个LinearLayout作为小圆点的父控件
<LinearLayout android:id="@+id/layoutIndicator" android:layout_width="fill_parent" android:layout_height="10dp" android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout>
2 在Activity里面根据界面的个数动态的添加小圆点
mLayoutIndicator = (LinearLayout)findViewById(R.id.layoutIndicator); for(int i = 0; i < mGuideImageId.length; i++) { ImageView imageView = new ImageView(this); imageView.setImageResource(R.drawable.guide_page_indicator); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(10, 10); lp.setMargins(0, 0, 5, 0); imageView.setLayoutParams(lp); mLayoutIndicator.addView(imageView); } ((ImageView)mLayoutIndicator.getChildAt(0)).setImageResource(R.drawable.guide_page_indicator_focused);//设置当前显示的界面小圆点与其他的不同
3 监听ViewPager的界面改变事件,当界面改变时,小圆点也要跟着改变。
mViewPager.setOnPageChangeListener(new OnPageChangeListener(){ public void onPageSelected(int position) { ((ImageView)mLayoutIndicator.getChildAt(position)).setImageResource(R.drawable.guide_page_indicator_focused); ((ImageView)mLayoutIndicator.getChildAt(mImgIndex)).setImageResource(R.drawable.guide_page_indicator); mImgIndex = position; } public void onPageScrollStateChanged(int arg0) { } public void onPageScrolled(int arg0, float arg1, int arg2) { } });
简单的程序启动引导功能就搞定了!