ViewPager多页面滑动切换以及动画效果

来源:互联网 发布:域名有 什么作用 编辑:程序博客网 时间:2024/05/17 07:29

一、首先,我们来看一下效果图,这是新浪微博的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"><LinearLayoutandroid:id="@+id/linearLayout1"        android:layout_width="fill_parent"        android:layout_height="100.0dip"        android:background="#FFFFFF"><TextViewandroid: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"/><TextViewandroid: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"/><TextViewandroid: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><ImageViewandroid:id="@+id/cursor"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:scaleType="matrix"        android:src="@drawable/a"/><android.support.v4.view.ViewPagerandroid: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) 先来变量的定义

private ViewPager mPager;//页卡内容private List<View> listViews; // Tab页面列表private ImageView cursor;// 动画图片private TextView t1, t2, t3;// 页卡头标privateint offset = 0;// 动画图片偏移量privateint currIndex = 0;// 当前页卡编号privateint bmpW;// 动画图片宽度

 

(2) 初始化头标

 1/** 2     * 初始化头标 3*/ 4privatevoid InitTextView() { 5         t1 = (TextView) findViewById(R.id.text1); 6         t2 = (TextView) findViewById(R.id.text2); 7         t3 = (TextView) findViewById(R.id.text3); 8 9         t1.setOnClickListener(new MyOnClickListener(0));10         t2.setOnClickListener(new MyOnClickListener(1));11         t3.setOnClickListener(new MyOnClickListener(2));12     }
 1/** 2     * 头标点击监听 3*/ 4publicclass MyOnClickListener implements View.OnClickListener { 5privateint index = 0; 6 7public MyOnClickListener(int i) { 8             index = i; 9         }1011         @Override12publicvoid onClick(View v) {13             mPager.setCurrentItem(index);14         }15     };

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

 

(3) 初始化页卡内容区

 1/** 2     * 初始化ViewPager 3*/ 4privatevoid InitViewPager() { 5         mPager = (ViewPager) findViewById(R.id.vPager); 6         listViews = new ArrayList<View>(); 7         LayoutInflater mInflater = getLayoutInflater(); 8         listViews.add(mInflater.inflate(R.layout.lay1, null)); 9         listViews.add(mInflater.inflate(R.layout.lay2, null));10         listViews.add(mInflater.inflate(R.layout.lay3, null));11         mPager.setAdapter(new MyPagerAdapter(listViews));12         mPager.setCurrentItem(0);13         mPager.setOnPageChangeListener(new MyOnPageChangeListener());14     }

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

 1/** 2     * ViewPager适配器 3*/ 4publicclass MyPagerAdapter extends PagerAdapter { 5public List<View> mListViews; 6 7public MyPagerAdapter(List<View> mListViews) { 8this.mListViews = mListViews; 9         }1011         @Override12publicvoid destroyItem(View arg0, int arg1, Object arg2) {13             ((ViewPager) arg0).removeView(mListViews.get(arg1));14         }1516         @Override17publicvoid finishUpdate(View arg0) {18         }1920         @Override21publicint getCount() {22return mListViews.size();23         }2425         @Override26public Object instantiateItem(View arg0, int arg1) {27             ((ViewPager) arg0).addView(mListViews.get(arg1), 0);28return mListViews.get(arg1);29         }3031         @Override32publicboolean isViewFromObject(View arg0, Object arg1) {33return arg0 == (arg1);34         }3536         @Override37publicvoid restoreState(Parcelable arg0, ClassLoader arg1) {38         }3940         @Override41public Parcelable saveState() {42returnnull;43         }4445         @Override46publicvoid startUpdate(View arg0) {47         }48     }

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

 

(3) 初始化动画

 1/** 2     * 初始化动画 3*/ 4privatevoid InitImageView() { 5         cursor = (ImageView) findViewById(R.id.cursor); 6         bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a) 7                 .getWidth();// 获取图片宽度 8         DisplayMetrics dm = new DisplayMetrics(); 9         getWindowManager().getDefaultDisplay().getMetrics(dm);10int screenW = dm.widthPixels;// 获取分辨率宽度11         offset = (screenW / 3 - bmpW) / 2;// 计算偏移量12         Matrix matrix = new Matrix();13         matrix.postTranslate(offset, 0);14         cursor.setImageMatrix(matrix);// 设置动画初始位置15     }

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

实现页卡切换监听

 1/** 2     * 页卡切换监听 3*/ 4publicclass MyOnPageChangeListener implements OnPageChangeListener { 5 6int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量 7int two = one * 2;// 页卡1 -> 页卡3 偏移量 8 9         @Override10publicvoid onPageSelected(int arg0) {11             Animation animation = null;12switch (arg0) {13case 0:14if (currIndex == 1) {15                     animation = new TranslateAnimation(one, 0, 0, 0);16                 } elseif (currIndex == 2) {17                     animation = new TranslateAnimation(two, 0, 0, 0);18                 }19break;20case 1:21if (currIndex == 0) {22                     animation = new TranslateAnimation(offset, one, 0, 0);23                 } elseif (currIndex == 2) {24                     animation = new TranslateAnimation(two, one, 0, 0);25                 }26break;27case 2:28if (currIndex == 0) {29                     animation = new TranslateAnimation(offset, two, 0, 0);30                 } elseif (currIndex == 1) {31                     animation = new TranslateAnimation(one, two, 0, 0);32                 }33break;34             }35             currIndex = arg0;36             animation.setFillAfter(true);// True:图片停在动画结束位置37             animation.setDuration(300);38             cursor.startAnimation(animation);39         }4041         @Override42publicvoid onPageScrolled(int arg0, float arg1, int arg2) {43         }4445         @Override46publicvoid onPageScrollStateChanged(int arg0) {47         }48     }

 

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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗腿受伤了肿了怎么办 狗狗缺钙腿变形怎么办 小狗腿摔骨折了怎么办 狗狗脚掌被压了怎么办 狗狗的脚骨折了怎么办 给猫灌药水呛到怎么办 吃佐匹克隆白天工作量降低怎么办? 手机网页不显示图片怎么办啊 页眉页脚同前节怎么办 小米8后盖缝隙大怎么办 狗子生了一个不动的小狗怎么办 狗狗肚子有脓包怎么办 小孩幼儿园数学不开窍怎么办 老百姓打仗了报警派出所不管怎么办 和人打架报案了怎么办 皇上死后的妃子怎么办 武警改制警卫系的学员怎么办 正团病故后住房怎么办 遇到保姆式领导该怎么办 限购房子卖不了怎么办 斑马线礼让行人行人不走怎么办 中国留学生签证在美国被取消怎么办 建行卡网银帐号密码输入错误怎么办 建行卡密码忘了怎么办? 银行卡k宝丢了怎么办 k宝密码锁住了怎么办 农业银行k宝锁了怎么办 银行卡办的网银卡丢了怎么办 事业单位考察档案丢了怎么办 当兵政审家访家里没人在家怎么办 士兵转业结婚材料不全怎么办 体育生训练腿疼怎么办 车底盘刮的严重怎么办 新车底盘被刮了怎么办 车侧面刮凹了怎么办 憋气久了想呕吐怎么办 19岁网贷欠了3万怎么办 大学生欠2w网贷怎么办 当兵去了网贷怎么办 考公安视力不过关怎么办 身份证号和姓名电话泄露了怎么办