http://www.cnblogs.com/lichenwei/p/3970053.html

这2天事情比较多,都没时间更新博客,趁周末,继续继续~

今天来讲个比较新潮的组件——ViewPager

什么是ViewPager?

ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果。

如果想向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。

通俗点来讲,就是现在市面上大多数app,安装完第一次打开软件会出现的一个左右滑动的引导界面。

先来看下效果图:

这是一个仿微信的引导界面,图是我抠来的

实现功能:

能够左右滑动页面,下面对应的小圆圈点顺带着走,也可以对小圆点进行点击跳转(有些人可能会采用把小圆点写死,直接画在界面上的背景图,其实这个是个很不好的习惯,太不灵活,一旦改动起来,很不好维护)

其实要实现这种效果并不难,ViewPager这个控件和其他常见控件的实现方式大致相同(比如:ListView)

步骤:声明实例化控件->设置数据源->配置适配器->绑定适配器->(添加监听)

声明控件:

由于该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”

1     <android.support.v4.view.ViewPager
2 android:id="@+id/viewpager"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent" />

数据源:

这里的是数据源是一个存放着View对象的集合:

实现方式有2种:

1、通过XML配置文件,把对应的页面设置好,然后把xml配置文件转换成view对象并载入这个集合里

2、通过代码动态生成,把生成的View对象载入到集合里。

适配器:

我们需要去继承PagerAdapter类,并覆写相对应的方法(在下面代码部分会详细说)

下面提供必须实现的,最基本的几个方法:

 1     @Override
2 public int getCount() {//返回页面数量
3 return 0;
4 }
5
6 @Override
7 public boolean isViewFromObject(View arg0, Object arg1) {//判断是否是view对象
8 return false;
9 }
10
11 @Override
12 public Object instantiateItem(View container, int position) {//实例化一个页面
13 return super.instantiateItem(container, position);
14 }
15
16 @Override
17 public void destroyItem(View container, int position, Object object) {//销毁一个页面
18 super.destroyItem(container, position, object);
19 }

当然还可以设置更多样式,比如给ViewPager的每个页面都加入标题等,这里就不再多说,大家自己翻看API吧。

直接上代码吧,本段代码是采用XML布局文件静态生成view对象的,其中有一段注释是提供代码动态生成view的方法,至于用哪个,看个人喜好了。

MainActivity.java(主程序类)

  1 package com.example.wx_viewpagertest;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import android.app.Activity;
7 import android.os.Bundle;
8 import android.support.v4.view.ViewPager;
9 import android.support.v4.view.ViewPager.OnPageChangeListener;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.widget.Button;
13 import android.widget.ImageView;
14 import android.widget.LinearLayout;
15 import android.widget.Toast;
16
17 public class MainActivity extends Activity implements OnPageChangeListener,OnClickListener{
18
19 private ViewPager viewPager;
20 private List<View> viewList;
21 //private int images[]={R.drawable.v1,R.drawable.v2,R.drawable.v3,R.drawable.v4};//导航图片资源
22 private View view1, view2, view3, view4;
23 private ImageView points[];//存放小圆圈数组
24
25 private int currentIndex=0;//当前页面,默认首页
26
27 private Button startButton;
28
29
30 @Override
31 protected void onCreate(Bundle savedInstanceState) {
32 super.onCreate(savedInstanceState);
33 setContentView(R.layout.activity_main);
34 initViewPager();//初始化ViewPager对象
35 initPoint();//初始化导航小圆点
36 }
37
38 private void initPoint() {
39 LinearLayout linearLayout=(LinearLayout) findViewById(R.id.ll);
40 points=new ImageView[4];
41 for(int i=0;i<points.length;i++){
42 points[i]=(ImageView) linearLayout.getChildAt(i);//遍历LinearLayout下的所有ImageView子节点
43 points[i].setEnabled(true);//设置当前状态为允许(可点,灰色)
44 //设置点击监听
45 points[i].setOnClickListener(this);
46
47 //额外设置一个标识符,以便点击小圆点时跳转对应页面
48 points[i].setTag(i);//标识符与圆点顺序一致
49 }
50
51 currentIndex=0;
52 points[currentIndex].setEnabled(false);//设置首页为当前页(小点着色,蓝色)
53
54
55
56 }
57
58 private void initViewPager() {
59 viewPager=(ViewPager) findViewById(R.id.viewpager);//取得ViewPager实例
60 viewList=new ArrayList<View>();//实例化list集合
61
62 /* 用代码的动态添加View
63 //添加对应的view进入集合(数据源)
64 for(int i=0;i<images.length;i++){
65 ImageView imageView=new ImageView(MainActivity.this);
66 imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
67 imageView.setScaleType(ScaleType.FIT_XY);//设置缩放样式
68 imageView.setImageResource(images[i]);
69 viewList.add(imageView);
70 }
71 */
72
73 //用xml静态添加view
74 view1=View.inflate(MainActivity.this, R.layout.view1, null);
75 view2=View.inflate(MainActivity.this, R.layout.view2, null);
76 view3=View.inflate(MainActivity.this, R.layout.view3, null);
77 view4=View.inflate(MainActivity.this, R.layout.view4, null);
78 viewList.add(view1);
79 viewList.add(view2);
80 viewList.add(view3);
81 viewList.add(view4);
82
83
84
85 //设置适配器
86 ImageAdapter adapter=new ImageAdapter(viewList);
87
88 //绑定适配器
89 viewPager.setAdapter(adapter);
90
91 //设置页卡切换监听
92 viewPager.setOnPageChangeListener(this);
93
94 }
95
96 @Override
97 public void onPageScrollStateChanged(int arg0) {
98
99 }
100
101 @Override
102 public void onPageScrolled(int arg0, float arg1, int arg2) {
103
104 }
105
106 @Override
107 public void onPageSelected(int position ) {//当前页卡被选择时,position为当前页数
108
109 if(position==3){//由于进入微信这个按钮在第4个页面(view)才会出现,如果一开始就加载这个按钮监听,就导致空指针异常
110 startButton=(Button) findViewById(R.id.startbutton);
111 startButton.setOnClickListener(new OnClickListener() {//匿名内部类,区分小圆圈的点击事件
112
113 @Override
114 public void onClick(View v) {
115 Toast.makeText(MainActivity.this, "欢迎进入微信世界", Toast.LENGTH_SHORT).show();
116 }
117 });
118 }
119 points[position].setEnabled(false);//不可点
120 points[currentIndex].setEnabled(true);//恢复之前页面状态
121 currentIndex=position;
122
123 }
124
125 @Override
126 public void onClick(View v) {
127 //利用刚设置的标识符跳转页面
128 //Log.i("tuzi",v.getTag()+"");
129 viewPager.setCurrentItem((int) v.getTag());
130
131 }
132
133 }

ImageAdapter.java(适配器类)

 1 package com.example.wx_viewpagertest;
2
3 import java.util.List;
4
5 import android.support.v4.view.PagerAdapter;
6 import android.view.View;
7 import android.view.ViewGroup;
8
9 public class ImageAdapter extends PagerAdapter {
10 private List<View> list;
11
12 public ImageAdapter(List<View> list) {// 利用构造器接收list集合参数
13 this.list = list;
14 }
15
16 @Override
17 public int getCount() {// 返回页卡数量
18 if (list.size() != 0) {
19 return list.size();
20 }
21 return 0;
22 }
23
24 @Override
25 public boolean isViewFromObject(View arg0, Object arg1) {//判断是否为view对象
26 return arg0==arg1;//官方demo给出的建议写法
27 }
28
29 @Override
30 public Object instantiateItem(ViewGroup container, int position) {//实例化一个页卡,view对象存放在ViewGroup里
31 container.addView(list.get(position));
32 return list.get(position);
33 }
34
35 @Override
36 public void destroyItem(ViewGroup container, int position, Object object) {//销毁一个页卡
37 container.removeView(list.get(position));
38 }
39
40 }

XML布局文件这里就不都贴出来了,就是简简单单的设置图片,文字按钮等

只贴其中比较特别的view:

主界面xml(activity_main.xml):

 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 tools:context="com.example.wx_viewpagertest.MainActivity" >
6
7 <android.support.v4.view.ViewPager
8 android:id="@+id/viewpager"
9 android:layout_width="fill_parent"
10 android:layout_height="fill_parent" />
11
12 <LinearLayout
13 android:id="@+id/ll"
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:layout_alignParentBottom="true"
17 android:layout_centerHorizontal="true"
18 android:layout_marginBottom="20dp"
19 android:orientation="horizontal" >
20
21 <ImageView
22 android:id="@+id/iv1"
23 android:layout_width="wrap_content"
24 android:layout_height="wrap_content"
25 android:layout_gravity="center_vertical"
26 android:clickable="true"
27 android:padding="25dp"
28 android:src="@drawable/point_selector" />
29
30 <ImageView
31 android:id="@+id/iv2"
32 android:layout_width="wrap_content"
33 android:layout_height="wrap_content"
34 android:layout_gravity="center_vertical"
35 android:clickable="true"
36 android:padding="25dp"
37 android:src="@drawable/point_selector" />
38
39 <ImageView
40 android:id="@+id/iv3"
41 android:layout_width="wrap_content"
42 android:layout_height="wrap_content"
43 android:layout_gravity="center_vertical"
44 android:clickable="true"
45 android:padding="25dp"
46 android:src="@drawable/point_selector" />
47
48 <ImageView
49 android:id="@+id/iv4"
50 android:layout_width="wrap_content"
51 android:layout_height="wrap_content"
52 android:layout_gravity="center_vertical"
53 android:clickable="true"
54 android:padding="25dp"
55 android:src="@drawable/point_selector" />
56 </LinearLayout>
57
58 </RelativeLayout>

最后一个页面带进入按钮的xml(view4.xml):

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:background="@drawable/v4"
6 android:orientation="vertical" >
7
8 <TextView
9 android:id="@+id/starttext"
10 android:layout_width="fill_parent"
11 android:layout_height="wrap_content"
12 android:layout_alignParentTop="true"
13 android:layout_centerHorizontal="true"
14 android:gravity="center"
15 android:layout_marginTop="80dp"
16 android:text="微信,是一种生活方式"
17 android:textColor="@android:color/white"
18 android:textSize="20dp" />
19
20 <Button
21 android:id="@+id/startbutton"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:layout_alignParentBottom="true"
25 android:layout_centerHorizontal="true"
26 android:layout_marginBottom="80dp"
27 android:background="@drawable/startbutton_selector"
28 android:text="@string/start"
29 android:textColor="@android:color/white"
30 android:textSize="18dp" />
31
32
33
34 </RelativeLayout>

这里还有个选择器,自定义小圆圈和Button按钮样式:

小圆圈:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android" >
3
4 <item
5 android:state_enabled="true" android:drawable="@drawable/v_point_nor"
6 ></item>
7
8 <item
9 android:state_enabled="false" android:drawable="@drawable/v_point_pre"
10 ></item>
11
12 </selector>

自定义按钮:

1 <?xml version="1.0" encoding="utf-8"?>
2 <selector xmlns:android="http://schemas.android.com/apk/res/android">
3 <item android:state_enabled="true" android:state_pressed="true"
4 android:drawable="@drawable/v_btn_pressed" />
5 <item android:state_enabled="true" android:drawable="@drawable/v_btn_nor" />
6 </selector>

好了,核心代码都给出了,注释已经很业界良心了~ See you!

作者:Balla_兔子
出处:http://www.cnblogs.com/lichenwei/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

转-ViewPager组件(仿微信引导界面)的更多相关文章

  1. Android控件-ViewPager(仿微信引导界面)

    什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...

  2. 安卓开发笔记——ViewPager组件(仿微信引导界面)

    这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGro ...

  3. 【Android UI设计与开发】第03期:引导界面(三)仿微信引导界面以及动画效果

    基于前两篇比较简单的实例做铺垫之后,这一篇我们来实现一个稍微复杂一点的引导界面的效果,当然也只是稍微复杂了一点,对于会的人来说当然还是so easy!正所谓会者不难,难者不会,大概说的就是这个意思了吧 ...

  4. Android控件-Fragment+ViewPager(高仿微信界面)

    什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个 ...

  5. Android ActionBar应用实战,高仿微信主界面的设计

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对 ...

  6. [Android] Android 手机下 仿 微信 客户端 界面 -- 微聊

    Android 手机下 仿 微信 客户端 界面 -- 微聊 (包括聊天列表 + 聊天对话页 + 朋友圈列表页 + 我的/发现 列表页) 项目演示: 功能说明: 1)底部标签切换 (TabHost + ...

  7. uni-app聊天室|vue+uniapp仿微信聊天实例|uniapp仿微信App界面

    一.介绍 运用UniApp+Vue+Vuex+swiper+uniPop等技术开发的仿微信原生App聊天室|仿微信聊天界面实例项目uniapp-chatroom,实现了发送图文消息.表情(gif图), ...

  8. Vue3.0网页版聊天|Vue3.x+ElementPlus仿微信/QQ界面|vue3聊天实例

    一.项目简介 基于vue3.x+vuex+vue-router+element-plus+v3layer+v3scroll等技术构建的仿微信web桌面端聊天实战项目Vue3-Webchat.基本上实现 ...

  9. Android利用ViewPager仿微信主界面-android学习之旅(78)

    首先是介绍ViewPager这个控件 ,这个控件需要pagerAdapter作为容器来提供数据,同时pagerAdapter的数据源是View数组 效果图如下 部分代码如下,实现如下的方法 mPage ...

随机推荐

  1. IntelliJ IDEA currently

    https://www.jetbrains.com/help/idea/2016.2/creating-a-project-from-scratch.html https://www.jetbrain ...

  2. 在Windows7上安装coreseek3.2同时在PHP下简单实现步骤

    这两天安装了coreseek+sphinx服务,前面装的是比较低版本的,再试了一下官网比较稳定一个版本1.首先下载:因为包有点大,就不在这里增加链接了,需要可以到官网下载 coreseek-3.2.1 ...

  3. Hive 安装配置记录

    http://yymmiinngg.iteye.com/blog/708230 export HADOOP_HOME_WARN_SUPPRESS=1 export JAVA_HOME=/home/ha ...

  4. ABBYY FineReader出现错误和警告提示的解决办法

    识别结果的质量取决于多种因素,这些因素包括原始文档的质量.结构布局和文档导出参数等.在使用ABBYY FineReader Pro for Mac OCR文字识别软件处理文档的各个阶段,应用程序均可能 ...

  5. 024. asp.net中第一次使用GridView (设置鼠标经过时更换背景色)

    1. 前端HTML代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Inde ...

  6. Win10 64位安装SQL2000(个人版)

    默认Win10上是不允许安装SQL2000的,毕竟SQL2000已经是10多年前的老软件了,但是因为它成熟稳定,相比SQL2005,SQL2008R2,SQL2012,SQL2014,体积要小的多,所 ...

  7. Java OCR 图像智能字符识别技术,可识别中文

    http://www.open-open.com/lib/view/open1363156299203.html

  8. MySQL explain key_len 大小的计算

    总结: 变长字段需要额外的2个字节,固定长度字段不需要额外的字节.而null都需要1个字节的额外空间,所以以前有个说法:索引字段最好不要为NULL,因为NULL让统计更加复杂,并且需要额外一个字节的存 ...

  9. ason 和 Java 对象转化示例

    1.工程 2.代码: JsonUtil.java package com.my.json; import java.util.ArrayList; import java.util.List; imp ...

  10. php.ini xdebug

    [XDebug]zend_extension = "C:\xampp\php\ext\php_xdebug.dll"xdebug.profiler_append = 0xdebug ...