ViewPager页面滑动切换

我们日常生活中用到的微博,QQ,微信等app在进行页面左右滑动的时候,很多都可以用ViewPager来实现。可以说,ViewPager在android开发中十分常见并且特别实用。

Viewpager在android.support.v4.view这个软件包中,  android.support.v4.view.jar是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。所以低版本开发时必须加入android-support-v4.jar,并且在XML文件使用ViewPager使用时以android.support.v4.view.ViewPager加入ViewPager。同时,该软件包还提供了一个PagerTitleStrip来显示每一个页卡的标题。

使用ViewPager实现页面滑动切换的方法和ListView差不多,同样也需要一个适配器,PagerAdapter,并且同样的也要重写其中的方法来实现。接下来我来说一下具体实现ViewPager的步骤。

1,在XML布局文件中加入ViewPager,以及它相对的标题PagerTitleStrip。

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" >
 5     <!--这里一定要注意通过android.support.v4.view包来使用ViewPager和PagerTitleStrip-->
 6     <android.support.v4.view.ViewPager
 7         android:id="@+id/viewrpager"
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:layout_gravity="center" >
11
12         <android.support.v4.view.PagerTitleStrip
13             android:id="@+id/pagertitle"
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:layout_gravity="top"
17             android:background="#00000000" >
18         </android.support.v4.view.PagerTitleStrip>
19     </android.support.v4.view.ViewPager>
20
21 </RelativeLayout>

2,接下来我们要添加三个页卡布局文件。具体内容可以自己添加,我为了方便每张页卡上只是用了一张图片作为背景。

3,为ViewPager添加一个适配器,这里我写了一个子类继承PagerAdapter。在子类中我们最重要的是要重写以下四个方法:

当然,如果想要更多更具体的功能,我们还可以重写其中的其他方法,但是以上四个方法是最必要的也是必须要重写实现的。

以下是该部分代码:

 1 package com.example.android_viewpage;
 2
 3 import java.util.List;
 4
 5 import android.content.Context;
 6 import android.support.v4.view.PagerAdapter;
 7 import android.support.v4.view.ViewPager;
 8 import android.view.View;
 9
10 public class MyAdapter extends PagerAdapter {
11     private List<View> list;
12     private List<String> titlelist;
13
14     public MyAdapter(List<String> titlelist, List<View> list) {
15         this.titlelist = titlelist;
16         this.list = list;
17     }
18     //这里获得当前页卡的标题
19     @Override
20     public CharSequence getPageTitle(int position) {
21         return titlelist.get(position);
22     }
23     @Override
24     public Object instantiateItem(View container, int position) {
25         ((ViewPager) container).addView(list.get(position));
26         return list.get(position);
27     }
28     //销毁页卡
29     @Override
30     public void destroyItem(View container, int position, Object object) {
31         ((ViewPager) container).removeView(list.get(position));
32     }
33     //得到所有页卡的个数
34     @Override
35     public int getCount() {
36         return list.size();
37     }
38     //判断当前显示页卡是否匹配
39     @Override
40     public boolean isViewFromObject(View arg0, Object arg1) {
41         return arg0 == arg1;
42     }
43
44 }

4,最后在MainActivity中将你想要的页卡和标题分别存放在List中,然后将定义好的适配器供ViewPager使用就可以了。

以下是该部分代码:

 1 package com.example.android_viewpage;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import android.app.Activity;
 6 import android.os.Bundle;
 7 import android.support.v4.view.PagerTabStrip;
 8 import android.support.v4.view.PagerTitleStrip;
 9 import android.support.v4.view.ViewPager;
10 import android.view.LayoutInflater;
11 import android.view.View;
12
13 public class MainActivity extends Activity {
14     private ViewPager viewPager;
15     private PagerTitleStrip pagerTitleStrip;
16     private MyAdapter adapter;
17     private List<View> list;
18     private List<String> titlelist;
19
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24         viewPager = (ViewPager) findViewById(R.id.viewrpager);
25         pagerTitleStrip = (PagerTitleStrip) findViewById(R.id.pagertitle);
26         list = new ArrayList<View>();
27         list.add(LayoutInflater.from(this).inflate(R.layout.view1, null));
28         list.add(LayoutInflater.from(this).inflate(R.layout.view2, null));
29         list.add(LayoutInflater.from(this).inflate(R.layout.view3, null));
30         titlelist = new ArrayList<String>();
31         titlelist.add("第一页");
32         titlelist.add("第二页");
33         titlelist.add("第三页");
34         adapter = new MyAdapter(titlelist, list);
35         viewPager.setAdapter(adapter);
36     }
37
38 }

这样就简单的实现了页面滑动切换的功能了。简要效果图如下:

但是我发现当我在滑动的时候标题的位置也跟着在一起移动,我想让页面在滑动的时候,标题不移动,但是要显示出不同的状态来。这里我简要的弄了一个类似微信的切换风格,在页卡滑动的时候让下方的按钮标题不同但显示出当前的状态,同时要求在点击下方的按钮时,也让页面切换到相对的状态下。

相比上面那个程序,这个主要的是设置了按钮的监听事件和页面滑动的监听事件。

其中页面滑动的监听事件是setOnPageChangeListener()。它有onPageSelected(),onPageScrolled(),onPageScrollStateChanged()三个方法,我这里只是对onPageSelected()方法进行了重写。

以下是MainActivity部分的代码:

  1 package com.example.viewpagertest;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 import android.R.integer;
  7 import android.app.Activity;
  8 import android.os.Bundle;
  9 import android.support.v4.view.ViewPager;
 10 import android.support.v4.view.ViewPager.OnPageChangeListener;
 11 import android.view.LayoutInflater;
 12 import android.view.View;
 13 import android.view.View.OnClickListener;
 14 import android.view.Window;
 15 import android.widget.ImageButton;
 16 import android.widget.LinearLayout;
 17
 18 public class MainActivity extends Activity implements OnClickListener {
 19
 20     private List<View> mPage;
 21     private MyPagerAdapter adapter;
 22     private ViewPager viewPager;
 23
 24     private ImageButton weixinImg;
 25     private ImageButton friendImg;
 26     private ImageButton addressImg;
 27     private ImageButton settingImg;
 28     private LinearLayout weixin;
 29     private LinearLayout friend;
 30     private LinearLayout address;
 31     private LinearLayout setting;
 32
 33     private static final int WEIXIN_STATE = 0;
 34     private static final int FRIEND_STATE = 1;
 35     private static final int ADDRESS_STATE = 2;
 36     private static final int SETTING_STATE = 3;
 37
 38     @Override
 39     protected void onCreate(Bundle savedInstanceState) {
 40         super.onCreate(savedInstanceState);
 41         requestWindowFeature(Window.FEATURE_NO_TITLE);
 42         setContentView(R.layout.activity_main);
 43         intiView();
 44         getClickEvent();
 45     }
 46
 47
 48
 49     private void intiView() {
 50
 51         // 呈现页面滑动效果
 52         viewPager = (ViewPager) findViewById(R.id.viewpage);
 53         mPage = new ArrayList<View>();
 54         mPage.add(LayoutInflater.from(this).inflate(R.layout.pageone, null));
 55         mPage.add(LayoutInflater.from(this).inflate(R.layout.pagetwo, null));
 56         mPage.add(LayoutInflater.from(this).inflate(R.layout.pagethree, null));
 57         mPage.add(LayoutInflater.from(this).inflate(R.layout.pagefour, null));
 58         adapter = new MyPagerAdapter(mPage);
 59         viewPager.setAdapter(adapter);
 60
 61         //加载控件
 62         weixinImg = (ImageButton) findViewById(R.id.id_weixin_img);
 63         friendImg = (ImageButton) findViewById(R.id.id_frd_img);
 64         addressImg = (ImageButton) findViewById(R.id.id_address_img);
 65         settingImg = (ImageButton) findViewById(R.id.id_settint_img);
 66
 67         weixin = (LinearLayout) findViewById(R.id.id_weixin);
 68         friend = (LinearLayout) findViewById(R.id.id_frd);
 69         address = (LinearLayout) findViewById(R.id.id_address);
 70         setting = (LinearLayout) findViewById(R.id.id_setting);
 71
 72     }
 73     /**
 74      *          按钮的点击事件:当点击按钮时,先让所有的按钮变成暗色,
 75      *          然后将所点击的按钮设置成亮色,并转到按钮所属页面
 76      */
 77     @Override
 78     public void onClick(View v) {
 79         setImg();
 80         switch (v.getId()) {
 81         case R.id.id_weixin:
 82             viewPager.setCurrentItem(WEIXIN_STATE);
 83             weixinImg.setImageResource(R.drawable.tab_weixin_pressed);
 84             break;
 85
 86         case R.id.id_frd:
 87             viewPager.setCurrentItem(FRIEND_STATE);
 88             friendImg.setImageResource(R.drawable.tab_find_frd_pressed);
 89             break;
 90
 91         case R.id.id_address:
 92             viewPager.setCurrentItem(ADDRESS_STATE);
 93             addressImg.setImageResource(R.drawable.tab_address_pressed);
 94             break;
 95
 96         case R.id.id_setting:
 97             viewPager.setCurrentItem(SETTING_STATE);
 98             settingImg.setImageResource(R.drawable.tab_settings_pressed);
 99             break;
100
101         }
102
103     }
104     private void getClickEvent() {
105         weixin.setOnClickListener(this);
106         friend.setOnClickListener(this);
107         address.setOnClickListener(this);
108         setting.setOnClickListener(this);
109 /**
110  *   页面滑动的监听事件:滑动页面时,先将所有按钮变成暗色
111  *   再把页面所属的按钮变成亮色,表示所属页面
112  */
113         viewPager.setOnPageChangeListener(new OnPageChangeListener() {
114
115             @Override
116             public void onPageSelected(int arg0) {
117                 setImg();
118                 switch (arg0) {
119                 case WEIXIN_STATE:
120                     weixinImg.setImageResource(R.drawable.tab_weixin_pressed);
121                     break;
122                 case FRIEND_STATE:
123                     friendImg.setImageResource(R.drawable.tab_find_frd_pressed);
124                     break;
125                 case ADDRESS_STATE:
126                     addressImg.setImageResource(R.drawable.tab_address_pressed);
127                     break;
128                 case SETTING_STATE:
129                     settingImg
130                             .setImageResource(R.drawable.tab_settings_pressed);
131                     break;
132
133                 }
134             }
135
136             @Override
137             public void onPageScrolled(int arg0, float arg1, int arg2) {
138
139             }
140
141             @Override
142             public void onPageScrollStateChanged(int arg0) {
143
144             }
145         });
146
147     }
148      //在点击按钮或者活动页面的时候,让所有按钮变成暗色
149     private void setImg() {
150         weixinImg.setImageResource(R.drawable.tab_weixin_normal);
151         friendImg.setImageResource(R.drawable.tab_find_frd_normal);
152         addressImg.setImageResource(R.drawable.tab_address_normal);
153         settingImg.setImageResource(R.drawable.tab_settings_normal);
154
155     }
156
157 }

这样就基本完成了想要的效果,以下是效果图:

时间: 2024-10-23 11:20:25

ViewPager页面滑动切换的相关文章

android(8) ViewPager页面滑动切换

一.ViewPager页面滑动切换实现:    借鉴了别人的源码,还是比较容易实现的,而且这种效果还是经常使用的,特此记录一下: 效果图: 主界面: public class MainActivity extends Activity { private ViewPager mPager;// 页卡内容 private List<View> listViews; // Tab页面列表 private ImageView cursor;// 动画图片 private TextView t1, t

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

背景                                                                                           ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换.这个附加包是android-support-v4.jar. 根据屏幕的分辨率和图片的宽度计算动画移动的偏移量 代码                                                   

Adapter类控件使用之ViewPager(视图滑动切换工具)的基本使用

(一)概述 Android 3.0后引入的一个UI控件--ViewPager(视图滑动切换工具),实在想不到 如何来称呼这个控件,他的大概功能:通过手势滑动可以完成View的切换,一般是用来做APP 的引导页或者实现图片轮播: (二)ViewPager的简单介绍 ViewPager就是一个简单的页面切换组件,我们可以往里面填充多个View,然后我们可以左 右滑动,从而切换不同的View,我们可以通过setPageTransformer()方法为我们的ViewPager 设置切换时的动画效果,当然

ViewPager之多页面滑动切换+游标滑动

我们先看下效果图 上图是我们需要实现的效果图,功能有如下三个: 1. 手势滑动可以切换界面,点击上面的引导一到引导四也可以切换到相应的画面. 2. 切换界面时,引导一到引导四下面的横线会相应的移动到对应的地方. 3. 没有手势时,界面会自动轮转,有种广告轮转的效果:有手势是,会停止轮转. 这里实现的时第二个功能. 思想:实现这个效果,其实是很简单的.一方面,我们需要初始化游标的状态,先获取一个TextView的宽度,然后把游标对应的ImageView的宽度也设置成这个大小,保证TextView和

ViewPager之多页面滑动切换

上图是我们需要实现的效果图,功能有如下三个: 1. 手势滑动可以切换界面,点击上面的引导一到引导四也可以切换到相应的画面. 2. 切换界面时,引导一到引导四下面的横线会相应的移动到对应的地方. 3. 没有手势时,界面会自动轮转,有种广告轮转的效果. 在这篇文章里,我们先实现第一个功能.为了实现这个功能,我们需要知道ViewPager控件,它是google SDk中自带的一个android-support-v4.jar的一个类,可以用来实现屏幕间的切换.这个包在我们创建新工程时会自动添加,因此无需

从零开始学习H5应用(1)——V1.0版,简单页面滑动切换效果

可曾看见过那些在微信上转疯了的H5神作?好生羡慕啊,那么从今天开始,我将从零开始学习制作H5应用,看看那么漂亮的页面是怎么样一步一步形成的. 准备 在学习制作H5应用之前,必须具备以下基础前提: HTML,CSS,JS基本编写与制作能力 了解了H5中的各种新特性 有一定的逻辑思维能力,可以将复杂任务通过分析简化为若干原子事件来处理 看得懂汉语,以及教程中出现的前端术语. 任务 这是本系列的第一篇,任务非常简单, 制作一个具有3张页面,每次只显示其中一张页面,当手指向上滑动设备屏幕时当前页面消失下

ViewPager之多页面滑动切换+游标滑动+ 自动无限轮转+触摸停止

我们先看下效果图 上图是我们需要实现的效果图,功能有如下三个: 1. 手势滑动可以切换界面,点击上面的引导一到引导四也可以切换到相应的画面. 2. 切换界面时,引导一到引导四下面的横线会相应的移动到对应的地方. 3. 没有手势时,界面会自动轮转,有种广告轮转的效果:有手势是,会停止轮转. 这次要实现的是第三个功能,实现第三个功能主要用到Handler和ViewPager的触摸监听器. Handler是为了实现隔一段时间自动切换页卡,因此需要定义一个Handler的对象,来处理自动切换,具体思想是

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

https://github.com/eltld/Viewpager

ViewPager源码分析——滑动切换页面处理过程

上周客户反馈Contacts快速滑动界面切换tab有明显卡顿,让优化. 自己验证又没发现卡顿现象,但总得给客户一个技术性的回复,于是看了一下ViewPager源码中处理滑动切换tab的过程. ViewPager  源码位置: android\frameworks\support\v4\java\android\support\v4\view\ViewPager.java ViewPager其实就是一个重写的ViewGroup,使用ViewPager可以参考SDK中的demo:sdk\extras