ViewPager也算是Android自带的常用控件之一,但是有可能会无法直接调用,所以只需要将工程目录里/libs/android-support-v4.jar该jarAdd to Build Path就可以了。
先来看看效果图吧:
一、首先完成布局文件:
从效果图可以分析出,整体的布局为一个RelativeLayout布局,上面是一个ViewPager,下面是一个LinearLayout,在LinearLayout里面,有一个TextView 和 几个小圆点,所以可以很容易的写出布局文件了。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="200dip" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/viewpager" android:background="#33000000" android:orientation="vertical" > <TextView android:id="@+id/image_desc" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@string/app_name" android:textColor="@android:color/white" android:textSize="18sp" /> <LinearLayout android:id="@+id/point_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="horizontal" /> </LinearLayout> </RelativeLayout>
二、在MainActivity中加载布局文件
1.通过ID查找出各个控件。
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); LinearLayout pointGroup = (LinearLayout) findViewById(R.id.point_group); TextView imageDesc = (TextView) findViewById(R.id.image_desc);2.初始化图片资源和指示点。
ArrayList<ImageView> imageList = new ArrayList<ImageView>(); for(int i = 0; i<imageIds.length;i++) { // 初始化图片资源 ImageView image = new ImageView(this); image.setBackgroundResource(imageIds[i]); imageList.add(image); // 添加指示点 ImageView point = new ImageView(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(5, 5); params.rightMargin = 20; point.setLayoutParams(params); point.setBackgroundResource(R.drawable.point_bg); if(i==0) { point.setEnabled(true); } else { point.setEnabled(false); } pointGroup.addView(point); }这个代码,先是创建了一个ArrayList来保存图片资源,然后通过一个循环,将每一张图片加载进入imageList,在加载图片的同时,也将指示点添加进入pointGroup指示点的资源ID--R.drawable.point_bg,是通过自己在/res/drawable中自己创建得来的,在drawable文件夹中,创建了三个XML文件,分别用来绘制不同状态的指示点。
其中point_bg.xml文件代码为:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/point_nomal" android:state_enabled="false"></item> <item android:drawable="@drawable/point_focured" android:state_enabled="true"></item> </selector>point_nomal.xml文件代码为:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="5dip" android:height="5dip"/> <solid android:color="#55000000"/> </shape>point_focured.xml文件代码为:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="5dip" android:height="5dip"/> <solid android:color="#aaFFFFFF"/> </shape>3.将资源添加进入viewPager。
viewPager.setAdapter(new MyPagerAdapter()); private class MyPagerAdapter extends PagerAdapter { /** * 获得页面的总数 */ @Override public int getCount() { return Integer.MAX_VALUE; // 因为需要无限循环,所以这里就不写imageList.size() } /** * 获得相应位置上的view * container view的容器,其实就是viewpager自身 * position 相应的位置 */ @Override public Object instantiateItem(ViewGroup container, int position) { // 给container添加内容 container.addView(imageList.get(position%imageList.size())); return imageList.get(position%imageList.size()); } /** * 判断view和object的对应关系 */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 销毁对应位置上的object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); object = null; } }现在就完成了基本的设置了,可以运行程序看一下效果了,现在已经可以循环的左右切换了。
三、增加自动切换
想要实现自动切换的方法比较多,大概分为:使用定时器;开启子线程;使用ColckManager;用handler发送延时信息。在此我们采用比较简单的方式--用handler发送延时信息。
// 判断是否执行动画 private boolean isRunning = false; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { // 滑动到下一页 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); if(isRunning) { handler.sendEmptyMessageDelayed(0, 2000); } }; };以上代码建立在onCreate()外,用于判断是否接收到了handler发送来的信息,如果接收到了,就将viewpager的显示后移一位延时2000毫秒后再发送出去。
然后在onCreate()方法中添加:
isRunning = true; handler.sendEmptyMessageDelayed(0, 2000);这样就完成了viewPager中图片的自动切换,但是在运行程序后发现,图片下面的Text和指示点并没有跟着切换,所以还需要添加一下代码:
viewPager.setOnPageChangeListener(new OnPageChangeListener() { /** * 页面切换后调用 * postion 新的页面位置 */ @Override public void onPageSelected(int position) { position = position%imageList.size(); // 设置文字描述内容 imageDesc.setText(imageDescriptions[position]); // 改变指示点的状态 pointGroup.getChildAt(position).setEnabled(true); pointGroup.getChildAt(lastPointPosition).setEnabled(false); lastPointPosition = position; } /** * 当页面正在滚动的时候 */ @Override public void onPageScrolled(int position, float positionOffset, int arg2) { } /** * 当页面状态发生变化的时候 */ @Override public void onPageScrollStateChanged(int arg0) { } });setOnPageChangeListener()是一个监听ViewPager页面变化的方法,其实的onPageSelected()是 当页面切换后调用的,在此我们重写了该方法。当切换到新的一页的时候,Text 和 指示点也跟着变换。