Android ViewPager多页面滑动切换以及动画效果
来源:互联网 发布:知乎的帖子怎么删除 编辑:程序博客网 时间:2024/06/07 03:32
DWINTER CODE
more in dwintergame.com
Android ViewPager多页面滑动切换以及动画效果
一、首先,我们来看一下效果图,这是新浪微博的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) 先来变量的定义
private ViewPager mPager;//页卡内容 private List<View> listViews; // Tab页面列表 private ImageView cursor;// 动画图片 private TextView t1, t2, t3;// 页卡头标 private int offset = 0;// 动画图片偏移量 private int currIndex = 0;// 当前页卡编号 private int bmpW;// 动画图片宽度
(2) 初始化头标
1 /** 2 * 初始化头标 3 */ 4 private void 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 */ 4 public class MyOnClickListener implements View.OnClickListener { 5 private int index = 0; 6 7 public MyOnClickListener(int i) { 8 index = i; 9 }10 11 @Override12 public void onClick(View v) {13 mPager.setCurrentItem(index);14 }15 };
相信大家看后都没什么问题,点击第几个,就展示第几个页卡内容。
(3) 初始化页卡内容区
1 /** 2 * 初始化ViewPager 3 */ 4 private void 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 */ 4 public class MyPagerAdapter extends PagerAdapter { 5 public List<View> mListViews; 6 7 public MyPagerAdapter(List<View> mListViews) { 8 this.mListViews = mListViews; 9 }10 11 @Override12 public void destroyItem(View arg0, int arg1, Object arg2) {13 ((ViewPager) arg0).removeView(mListViews.get(arg1));14 }15 16 @Override17 public void finishUpdate(View arg0) {18 }19 20 @Override21 public int getCount() {22 return mListViews.size();23 }24 25 @Override26 public Object instantiateItem(View arg0, int arg1) {27 ((ViewPager) arg0).addView(mListViews.get(arg1), 0);28 return mListViews.get(arg1);29 }30 31 @Override32 public boolean isViewFromObject(View arg0, Object arg1) {33 return arg0 == (arg1);34 }35 36 @Override37 public void restoreState(Parcelable arg0, ClassLoader arg1) {38 }39 40 @Override41 public Parcelable saveState() {42 return null;43 }44 45 @Override46 public void startUpdate(View arg0) {47 }48 }
这里我们实现了各页卡的装入和卸载
(3) 初始化动画
1 /** 2 * 初始化动画 3 */ 4 private void 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);10 int 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 */ 4 public class MyOnPageChangeListener implements OnPageChangeListener { 5 6 int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量 7 int two = one * 2;// 页卡1 -> 页卡3 偏移量 8 9 @Override10 public void onPageSelected(int arg0) {11 Animation animation = null;12 switch (arg0) {13 case 0:14 if (currIndex == 1) {15 animation = new TranslateAnimation(one, 0, 0, 0);16 } else if (currIndex == 2) {17 animation = new TranslateAnimation(two, 0, 0, 0);18 }19 break;20 case 1:21 if (currIndex == 0) {22 animation = new TranslateAnimation(offset, one, 0, 0);23 } else if (currIndex == 2) {24 animation = new TranslateAnimation(two, one, 0, 0);25 }26 break;27 case 2:28 if (currIndex == 0) {29 animation = new TranslateAnimation(offset, two, 0, 0);30 } else if (currIndex == 1) {31 animation = new TranslateAnimation(one, two, 0, 0);32 }33 break;34 }35 currIndex = arg0;36 animation.setFillAfter(true);// True:图片停在动画结束位置37 animation.setDuration(300);38 cursor.startAnimation(animation);39 }40 41 @Override42 public void onPageScrolled(int arg0, float arg1, int arg2) {43 }44 45 @Override46 public void onPageScrollStateChanged(int arg0) {47 }48 }
五、打完收工,快来看看自己的劳动成果吧
源码分享:http://115.com/file/dpi0unyg
作品发布:dwintergame.com
个人开发盈利方案: 传送门
本文版权归作者D.Winter和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
» 博主下一篇:Android 游戏引擎libgdx 初体验整理
« 首页上一篇:SQL Azure (六) 使用Project Houston管理SQL Azure
» 首页下一篇:面向对象软件设计原则(三) —— 软件实体的设计原则
posted on 2012-02-27 11:40 D.Winter 阅读(33543) 评论(77) 编辑 收藏
评论
#28楼[楼主] 2012-06-01 14:27 D.Winter
#29楼 2012-07-05 14:18 olue
#30楼 2012-07-05 15:41 olue
我也发现不能添加button的事件,后来网上查了下,改用Tabhost+ViewPager就可以了
#31楼[楼主] 2012-07-06 07:37 D.Winter
貌似很多问了这个 button事件
可以添加的
#32楼 2012-07-11 10:31 雪域迷城
#33楼 2012-07-11 10:48 雪域迷城
你里面的东西,ABCDE之类的TextView能不能改成WebView
#34楼[楼主] 2012-07-11 10:50 D.Winter
当然可以,试着在适配器初始化时加载
#35楼 2012-07-11 15:55 雪域迷城
您好,我也想到要能行就是在适配器中加载,本人是菜鸟不太熟悉,您能帮忙加载一个网页给我看看,谢谢!!您就在您上面这个demo上加载一个网页给我发个DEMO,谢谢了。我的QQ是:695242104;邮箱:jinl2260@gmail.com。谢谢了!!!您告诉我联系方式我加您请教一下吧
#36楼 2012-07-11 16:17 雪域迷城
您告诉一下我在哪个位置上加也行。谢谢了。LZ真的不好意思,我急用的。谢谢
#37楼[楼主] 2012-07-11 16:19 D.Winter
看下
Android ViewPager多页面滑动切换以及动画效果(续)——单页卡内添加事件
应该就那里
#38楼 2012-07-11 17:03 雪域迷城
谢谢,解决我的大难题了。您方便留个联系方式?QQ什么的?向您学习
#39楼 2012-07-11 18:17 雪域迷城
#40楼[楼主] 2012-07-11 18:48 D.Winter
我真没用过WebView,介意你去eoe社区看看。
#41楼 2012-07-11 21:35 雪域迷城
好的,谢谢!
#42楼 2012-07-18 11:37 欢喜王子
不知道为什么你的这个代码中的注释为乱码。
#43楼[楼主] 2012-07-18 11:38 D.Winter
我是用utf-8的。
#44楼 2012-07-20 17:11 欢喜王子
谢谢回复.
使用View pager 目前的代码只能够实现切换不同的Layout但是不会调用activity 的后台代码,网上有很多例子之介绍了切换界面,没有实现界面中的后台功能,不知你有没有好的解决方法,谢谢.
#45楼[楼主] 2012-07-20 23:04 D.Winter
“调用activity 的后台代码” 是什么?
这个http://www.cnblogs.com/dwinter/archive/2012/07/06/2579112.html?
#46楼 2012-08-18 20:48 淅沥枫
#47楼 2012-08-18 20:49 淅沥枫
资源命名还要有意义的好,(我的出现空指针异常了.)
#48楼 2012-08-25 13:20 cmo
#49楼[楼主] 2012-08-25 13:22 D.Winter
再仔细检查检查吧 人家都可以的
#50楼 2012-08-25 13:34 cmo
不知道是怎么回事我在实现onPageChangeListner接口时和OnClickListener接口时,无法重写onClick和onPageSelected方法,加上@Override就报错
#51楼[楼主] 2012-08-25 13:36 D.Winter
jdk编译用1.6
#52楼 2012-08-25 13:39 cmo
我的JDK是1.7的怎么修改,jdk1.6可以与最新版的ADT搭建吗
#53楼[楼主] 2012-08-25 13:40 D.Winter
项目 右键属性 点java编译 试试
#54楼 2012-08-25 13:45 cmo
#55楼[楼主] 2012-08-25 13:46 D.Winter
我都选1.6的
#56楼 2012-08-25 13:48 cmo
#57楼 2012-08-25 23:14 cmo
楼主改了很久,还是不行,点击第一次时就移动一点点,然后点击第二个tab时就不移动了,可以留个邮箱发给你 帮忙下吗
#58楼[楼主] 2012-08-26 11:23 D.Winter
wudong61228@qq.com
#59楼 2012-09-11 15:28 为梦奔跑
可以,Button 都有onclick属性 ,后面跟你在Activity的方法名就可以了,写的方法参数必须是一个View类型的
#60楼 2012-09-11 17:11 为梦奔跑
应该再加一个offset,看楼主效果应该是有偏移
#61楼 2012-09-15 16:19 geeker
#62楼 2012-10-09 18:02 xfyunyun
#63楼[楼主] 2012-10-24 16:05 D.Winter
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=115246
看下这篇帖子吧
#64楼 2012-11-05 14:26 Miller_li
#65楼 2012-11-09 10:18 chenghu1982
Animation animation = new TranslateAnimation(one*currIndex, one*arg0, 0, 0);
就得了,冤枉多30行代码
#66楼[楼主] 2012-11-09 10:21 D.Winter
多谢指出,我写代码太随便了,想到哪里写到哪里。。。
#67楼 2012-11-23 01:59 songshijia88888
#68楼 2013-03-07 22:22 microxxx
谢谢!
#69楼 2013-03-17 23:40 LinKang
#70楼[楼主] 2013-03-20 11:54 D.Winter
有个软件,但是我忘记叫什么了,后来自己网上又搜了个 GIF动态截图 的类似软件
#71楼[楼主] 2013-03-20 11:55 D.Winter
估计要实时获取触点坐标并去更新动画,本人没试过。
#72楼 2013-04-16 19:57 twlkyao
#73楼 2013-04-18 14:14 江浸月
#74楼[楼主] 2013-04-18 15:51 D.Winter
初始化动画的时候,直接设置为第二个试试
matrix.postTranslate(offset*3+bmpW, 0);
#75楼 2013-04-18 15:59 江浸月
非常感谢您这么快的回复。
这样改不行,移动到页卡3时,指示条就跑出屏幕了。
#76楼[楼主] 2013-04-18 16:01 D.Winter
private int currIndex = 1;// 当前页卡编号
=1了吗
#77楼 2013-04-18 16:12 江浸月
是的,设置为1了。页卡现在没有问题。就是指示条的位置不对。
谢谢!
- [Android实例] ViewPager多页面滑动切换以及动画效果
- [Android实例] ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- [Android实例] ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果!!!
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- Android ViewPager多页面滑动切换以及动画效果
- JS读取XML数据
- Java 虚拟机体系结构
- JDBC日期处理
- java获取远程资源
- VS2008 error LNK2019: 无法解析的外部符号 __imp___vsnprintf,该符号在函数 _StringVPrintfWorkerA@
- Android ViewPager多页面滑动切换以及动画效果
- GET方法和POST方法的区别
- mongodb replica sets reconfig and conver a Secondary to an Arbiter
- 生命的列车
- emacs笔记二: 高级操作
- node.js安装--redhat5
- python学习重温(2)---自动case生成工具之elementtree
- Db2自定义函数
- Dom4j解析xml && json格式转换成String
我猜 要么在头尾各再加入一个页卡
在页卡切换监听中判断,如果选中了头尾的页卡,就返回到相邻的那个页卡。头尾页卡的界面可以只是个背景色。