一、首先,我们来看一下效果图,这是新浪微博的Tab滑动效果。我们可以手势滑动,也可以点击上面的头标进行切换。与此同方式,
白色横条会移动到相应的页卡头标下。这是一个动画效果,白条是缓慢滑动过去的。好了,接下来我们就来实现它。
二、在开始前,我们先要认识一个控件,ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
这个附加包是android-support-v4.jar,在最后的源码中会提供给大家,在libs文件夹中。当然你也可以自己从网上搜索最新的版本。
找到它后,我们需要在项目中添加
三、我们先做界面,
界面设计很简单,第一行三个头标,第二行动画图片,第三行页卡内容展示。
我们要展示三个页卡,所以还需要三个页卡内容的界面设计,这里我们只设置了背景颜色,能起到区别作用即可。
四、代码部分要进行初始化的工作
(1) 先来变量的定义
ViewPager mPager; ListlistViews; 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 { ListmListViews; 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) { } }
五、打完收工,快来看看自己的劳动成果吧