超神学院

导航

ViewPager

传送门:Android开发者如何日进斗金,手把手教你教你APP推广和盈利的方案

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

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

 

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

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

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

 

三、我们先做界面,

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

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:umadsdk="http://schemas.android.com/apk/res/com.LoveBus"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

<LinearLayout

android:id="@+id/linearLayout1"

android:layout_width="fill_parent"

android:layout_height="100.0dip"

android:background="#FFFFFF">

<TextView

android:id="@+id/text1"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1.0"

android:gravity="center"

android:text="页卡1"

android:textColor="#000000"

android:textSize="22.0dip"/>

<TextView

android:id="@+id/text2"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1.0"

android:gravity="center"

android:text="页卡2"

android:textColor="#000000"

android:textSize="22.0dip"/>

<TextView

android:id="@+id/text3"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1.0"

android:gravity="center"

android:text="页卡3"

android:textColor="#000000"

android:textSize="22.0dip"/>

</LinearLayout>

<ImageView

android:id="@+id/cursor"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:scaleType="matrix"

android:src="@drawable/a"/>

<android.support.v4.view.ViewPager

android:id="@+id/vPager"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:layout_weight="1.0"

android:background="#000000"

android:flipInterval="30"

android:persistentDrawingCache="animation"/>

</LinearLayout>

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

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

android:background="#158684">

</LinearLayout>

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

(1) 先来变量的定义

privateViewPager mPager;//页卡内容

privateList<View> listViews; //Tab页面列表

privateImageView cursor;//动画图片

privateTextView t1, t2, t3;//页卡头标

privateintoffset = 0;//动画图片偏移量

privateintcurrIndex = 0;//当前页卡编号

privateintbmpW;//动画图片宽度

(2) 初始化头标

1/**

2* 初始化头标

3*/

4privatevoidInitTextView() {

5t1 = (TextView) findViewById(R.id.text1);

6t2 = (TextView) findViewById(R.id.text2);

7t3 = (TextView) findViewById(R.id.text3);

8

9t1.setOnClickListener(newMyOnClickListener(0));

10t2.setOnClickListener(newMyOnClickListener(1));

11t3.setOnClickListener(newMyOnClickListener(2));

12}

1/**

2* 头标点击监听

3*/

4publicclassMyOnClickListener implementsView.OnClickListener {

5privateintindex = 0;

6

7publicMyOnClickListener(inti) {

8index = i;

9}

10

11@Override

12publicvoidonClick(View v) {

13mPager.setCurrentItem(index);

14}

15};

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

(3) 初始化页卡内容区

1/**

2* 初始化ViewPager

3*/

4privatevoidInitViewPager() {

5mPager = (ViewPager) findViewById(R.id.vPager);

6listViews = newArrayList<View>();

7LayoutInflater mInflater = getLayoutInflater();

8listViews.add(mInflater.inflate(R.layout.lay1, null));

9listViews.add(mInflater.inflate(R.layout.lay2, null));

10listViews.add(mInflater.inflate(R.layout.lay3, null));

11mPager.setAdapter(newMyPagerAdapter(listViews));

12mPager.setCurrentItem(0);

13mPager.setOnPageChangeListener(newMyOnPageChangeListener());

14}

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

1/**

2* ViewPager适配器

3*/

4publicclassMyPagerAdapter extendsPagerAdapter {

5publicList<View> mListViews;

6

7publicMyPagerAdapter(List<View> mListViews) {

8this.mListViews = mListViews;

9}

10

11@Override

12publicvoiddestroyItem(View arg0, intarg1, Object arg2) {

13((ViewPager) arg0).removeView(mListViews.get(arg1));

14}

15

16@Override

17publicvoidfinishUpdate(View arg0) {

18}

19

20@Override

21publicintgetCount() {

22returnmListViews.size();

23}

24

25@Override

26publicObject instantiateItem(View arg0, intarg1) {

27((ViewPager) arg0).addView(mListViews.get(arg1), 0);

28returnmListViews.get(arg1);

29}

30

31@Override

32publicbooleanisViewFromObject(View arg0, Object arg1) {

33returnarg0 == (arg1);

34}

35

36@Override

37publicvoidrestoreState(Parcelable arg0, ClassLoader arg1) {

38}

39

40@Override

41publicParcelable saveState() {

42returnnull;

43}

44

45@Override

46publicvoidstartUpdate(View arg0) {

47}

48}

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

(3) 初始化动画

1/**

2* 初始化动画

3*/

4privatevoidInitImageView() {

5cursor = (ImageView) findViewById(R.id.cursor);

6bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)

7.getWidth();//获取图片宽度

8DisplayMetrics dm = newDisplayMetrics();

9getWindowManager().getDefaultDisplay().getMetrics(dm);

10intscreenW = dm.widthPixels;//获取分辨率宽度

11offset = (screenW / 3 - bmpW) / 2;//计算偏移量

12Matrix matrix = newMatrix();

13matrix.postTranslate(offset, 0);

14cursor.setImageMatrix(matrix);//设置动画初始位置

15}

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

 

实现页卡切换监听

1/**

2* 页卡切换监听

3*/

4publicclassMyOnPageChangeListener implementsOnPageChangeListener {

5

6intone = offset * 2 + bmpW;//页卡1 -> 页卡2 偏移量

7inttwo = one * 2;//页卡1 -> 页卡3 偏移量

8

9@Override

10publicvoidonPageSelected(intarg0) {

11Animation animation = null;

12switch(arg0) {

13case0:

14if(currIndex == 1) {

15animation = newTranslateAnimation(one, 0, 0, 0);

16} elseif(currIndex == 2) {

17animation = newTranslateAnimation(two, 0, 0, 0);

18}

19break;

20case1:

21if(currIndex == 0) {

22animation = newTranslateAnimation(offset, one, 0, 0);

23} elseif(currIndex == 2) {

24animation = newTranslateAnimation(two, one, 0, 0);

25}

26break;

27case2:

28if(currIndex == 0) {

29animation = newTranslateAnimation(offset, two, 0, 0);

30} elseif(currIndex == 1) {

31animation = newTranslateAnimation(one, two, 0, 0);

32}

33break;

34}

35currIndex = arg0;

36animation.setFillAfter(true);//True:图片停在动画结束位置

37animation.setDuration(300);

38cursor.startAnimation(animation);

39}

40

41@Override

42publicvoidonPageScrolled(intarg0, floatarg1, intarg2) {

43}

44

45@Override

46publicvoidonPageScrollStateChanged(intarg0) {

47}

48}

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

posted on 2016-01-03 08:20  超神学院  阅读(155)  评论(0)    收藏  举报