一、首先,我们来看一下效果图,这是新浪微博的Tab滑动效果。我们可以手势滑动,也可以点击上面的头标进行切换。与此同方式,

白色横条会移动到相应的页卡头标下。这是一个动画效果,白条是缓慢滑动过去的。好了,接下来我们就来实现它。

 

二、在开始前,我们先要认识一个控件,ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。

这个附加包是android-support-v4.jar,在最后的源码中会提供给大家,在libs文件夹中。当然你也可以自己从网上搜索最新的版本。

找到它后,我们需要在项目中添加

 

三、我们先做界面,

界面设计很简单,第一行三个头标,第二行动画图片,第三行页卡内容展示。

 

我们要展示三个页卡,所以还需要三个页卡内容的界面设计,这里我们只设置了背景颜色,能起到区别作用即可。

 

四、代码部分要进行初始化的工作

(1) 先来变量的定义

     ViewPager mPager;     List
 listViews;      ImageView cursor;     TextView t1, t2, t3;      offset = 0;      currIndex = 0;      bmpW;

 

(2) 初始化头标

              InitTextView() {         t1 = (TextView) findViewById(R.id.text1);         t2 = (TextView) findViewById(R.id.text2);         t3 = (TextView) findViewById(R.id.text3);          t1.setOnClickListener( MyOnClickListener(0));         t2.setOnClickListener( MyOnClickListener(1));         t3.setOnClickListener( MyOnClickListener(2));     }

              MyOnClickListener  View.OnClickListener {           index = 0;           MyOnClickListener( i) {             index = i;         }          @Override           onClick(View v) {             mPager.setCurrentItem(index);         }     };

相信大家看后都没什么问题,点击第几个,就展示第几个页卡内容。

 

(3) 初始化页卡内容区

              InitViewPager() {         mPager = (ViewPager) findViewById(R.id.vPager);         listViews =  ArrayList
();         LayoutInflater mInflater = getLayoutInflater();         listViews.add(mInflater.inflate(R.layout.lay1, ));         listViews.add(mInflater.inflate(R.layout.lay2, ));         listViews.add(mInflater.inflate(R.layout.lay3, ));         mPager.setAdapter( MyPagerAdapter(listViews));         mPager.setCurrentItem(0);         mPager.setOnPageChangeListener( MyOnPageChangeListener());     }

我们将三个页卡界面装入其中,默认显示第一个页卡。这里我们还需要实现一个适配器。

          MyPagerAdapter  PagerAdapter {          List
 mListViews;           MyPagerAdapter(List
 mListViews) {             .mListViews = mListViews;         }          @Override           destroyItem(View arg0,  arg1, Object arg2) {             ((ViewPager) arg0).removeView(mListViews.get(arg1));         }          @Override           finishUpdate(View arg0) {         }          @Override           getCount() {              mListViews.size();         }          @Override          Object instantiateItem(View arg0,  arg1) {             ((ViewPager) arg0).addView(mListViews.get(arg1), 0);              mListViews.get(arg1);         }          @Override           isViewFromObject(View arg0, Object arg1) {              arg0 == (arg1);         }          @Override           restoreState(Parcelable arg0, ClassLoader arg1) {         }          @Override          Parcelable saveState() {              ;         }          @Override           startUpdate(View arg0) {         }     }

这里我们实现了各页卡的装入和卸载

 

(3) 初始化动画

              InitImageView() {         cursor = (ImageView) findViewById(R.id.cursor);         bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)                 .getWidth();         DisplayMetrics dm =  DisplayMetrics();         getWindowManager().getDefaultDisplay().getMetrics(dm);          screenW = dm.widthPixels;         offset = (screenW / 3 - bmpW) / 2;         Matrix matrix =  Matrix();         matrix.postTranslate(offset, 0);         cursor.setImageMatrix(matrix);     }

根据屏幕的分辨率和图片的宽度计算动画移动的偏移量

实现页卡切换监听

          MyOnPageChangeListener  OnPageChangeListener {           one = offset * 2 + bmpW;          two = one * 2;          @Override           onPageSelected( arg0) {             Animation animation = ;              (arg0) {              0:                  (currIndex == 1) {                     animation =  TranslateAnimation(one, 0, 0, 0);                 }   (currIndex == 2) {                     animation =  TranslateAnimation(two, 0, 0, 0);                 }                 ;              1:                  (currIndex == 0) {                     animation =  TranslateAnimation(offset, one, 0, 0);                 }   (currIndex == 2) {                     animation =  TranslateAnimation(two, one, 0, 0);                 }                 ;              2:                  (currIndex == 0) {                     animation =  TranslateAnimation(offset, two, 0, 0);                 }   (currIndex == 1) {                     animation =  TranslateAnimation(one, two, 0, 0);                 }                 ;             }             currIndex = arg0;             animation.setFillAfter();             animation.setDuration(300);             cursor.startAnimation(animation);         }          @Override           onPageScrolled( arg0,  arg1,  arg2) {         }          @Override           onPageScrollStateChanged( arg0) {         }     }

 

五、打完收工,快来看看自己的劳动成果吧