之前对viewpager没怎么用过,今天就自己学习看一看,它根继承于 Object类,在object类之后,则是View和ViewGroup类,一般,我们使用的是android.support.v4.view.viewpaer,所以在使用时在布局文件里,引入具体的包名跟类
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<android.support.v4.view.PagerTitleStrip
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="50dip"
android:gravity="center" />
</android.support.v4.view.ViewPager>
在上面的代码中,我们可以看到,对于viewpager的具体包名跟类名,会写的很详细,PagerTitleStrip是表示viewpager显示的标题,它必须作为viewpager的子目录而存在,否则就会出错,
用viewpager来做界面的浏览,主要有以下几个步骤:
首先,viewpager的申明,在布局文件中申明之后,在Activity中找到申明
viewPager = (ViewPager) MainActivity.this.findViewById(R.id.viewpager);
在对viewpager进行申明之后,则我们需要考虑的问题就是,我们的界面需要展现多少个分界面,于是我们就需要构建多少个xml界面来构成,在此处我们分别构建了三个xml布局文件,由于代码比较简单,不再贴出,在Activity中加入需要加入的界面。
viewList = new ArrayList<View>();
View view1 = LayoutInflater.from(MainActivity.this).inflate(
R.layout.tab1, null);
View view2 = LayoutInflater.from(MainActivity.this).inflate(
R.layout.tab2, null);
View view3 = LayoutInflater.from(MainActivity.this).inflate(
R.layout.tab3, null);
View view4 = LayoutInflater.from(MainActivity.this).inflate(
R.layout.tab4, null);
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
viewList.add(view4);
其次,对PagerTitleStrip进行标题的定义和预设,通过数组引入
titleS = new ArrayList<String>();
titleS.add("First");
titleS.add("Second");
titleS.add("Three");
titleS.add("Four");
再次,viewpager也和Listview这些组件一样,需要自己的适配器来进行匹配,所以需要进行适配器的编写。
private class MyAdapter extends PagerAdapter {
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
((ViewPager)container).addView(viewList.get(position));
return viewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
((ViewPager)container).removeView(viewList.get(position));
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titleS.get(position);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
}
在上面的适配器的继承中,我们一般需要实现以上几个方法。
bject instantiateItem(ViewGroup container, int position) // 对它的一个初始化
void destroyItem(ViewGroup container, int position, Object object) //在页面进行切换后的一个销毁
<pre name="code" class="java"> int getCount() //切换界面的个数
<pre name="code" class="java"> CharSequence getPageTitle(int position) // 与之对应的标题
<pre name="code" class="java"> public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
} //官方的一个写法,就照着这么写就是了
在配置好适配器之后,最简单的初级效果就显示了。
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 最后,viewPager.setOnPageChangeListener(new MyOnpageChangeListener()); 由于很多的时候,viewpager上的数据并不是写死的,而是会通过连接网络来获取数据,那么我们就需要知道,一般在哪里能够监听数据的获取与变换呢?此时我们则需要增加界面的改变监听。</span>
private class MyOnpageChangeListener implements ViewPager.OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int a) {
// TODO Auto-generated method stub
// Log.i(TAG, ">>>>>>a>>>>>"+a);
}
@Override
public void onPageScrolled(int b, float c, int d) {
// TODO Auto-generated method stub
Log.i(TAG, ">>>>>>b>>>>>"+b);
// Log.i(TAG, ">>>>>>c>>>>>"+c);
// Log.i(TAG, ">>>>>>d>>>>>"+d);
}
@Override
public <span style="font-family: Arial, Helvetica, sans-serif;">void onPageSelected(int e)</span>
{
// TODO Auto-generated method stub
// Log.i(TAG, ">>>>>e>>>>>>"+e);
}
}
自定义派生类实现onPagerChangeListener,它主要需要三个方法,第一个方法 onPageScrollStateChanged(int a)中,它表示pager的滑动状态的改变,它的int值有三个,分别为
SCROLL_STATE_IDLE = 0,表示无任何动作与行为,
SCROLL_STATE_DRAGGING = 1, 表示正在滑动中
SCROLL_STATE_SETTING = 2 滑动完成
void onPageSelected(int e)方法,它表示当前选择的pager,从position = 0开始计算,而下一个要显示的则表示为position + 1,只有当界面完全滑动定下来之后就会改变 。
void onPageScrolled(int b, float c, int d) 这个方法中,三个参数分别表示
<span style="font-family: Arial, Helvetica, sans-serif;"> b position 表示位置,从0开始,切换一个就进行改变;</span>
c positionOffset它是一个[0, 1)的一个浮点值,表示界面位置的一个偏移量,我自己是这么理解的,就是说一个界面大概偏移了多少,如果偏移了0.5f,则到了一半,再多一点就进入下一个界面,没有到一半,松手后还是保持当前的界面不切换,欢迎大侠指点下看是不是这么理解的。
d positionOffsetPixels 表示像素的偏移值</span>
Log日志如下
源代码下载: http://download.csdn.net/detail/u012159034/8984279