安卓开发复习笔记——ViewPager组件(仿微信引导界面>)

这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!

时间: 2024-10-25 07:42:31

安卓开发复习笔记——ViewPager组件(仿微信引导界面>)的相关文章

安卓开发复习笔记——TabHost组件(实现底部菜单导航)

安卓开发复习笔记——TabHost组件(实现底部菜单导航) 4 来源:cnblog    阅读:1048   时间:2014-09-16 什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面. TabHost选项卡,说到这个组件,不得不先说一件事情,翻翻谷歌提供给我们的API,我们可以发现这样的一段话: 它告诉我们,这个组件在安卓4.0之后已经被废弃了,建议我们新的程序应该使用Fragment组件

安卓开发复习笔记——WebView组件

我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebView? WebView(网络视图)能加载显示网页,可以将其视为一个浏览器,它使用了WebKit渲染引擎加载显示网页. 废话不多说,直接上代码 1.需要在xml布局文件中声明WebView组件 1 <WebView 2 android:id="@+id/webview" 3 androi

安卓开发复习笔记——GridView组件

1.什么是GridView? GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的. 2.正文 GridView的用法很多,网上介绍最多的方法就是自己实现一个ImageAdapter继承BaseAdapter,再供GridView使用,太多的东西我就不再重复去写,这次记录点不一样的用法. 先看下效果图:(点击应用图标以Toast的方式显示信息) 首先先说下GridView常用的XML属性: 属性名称 描述

安卓开发复习笔记——Gallery组件+ImageSwitcher组件

什么是Gallery? Gallery是一个水平的列表选择框,它允许用户通过拖动来查看上一个.下一个列表选项. 下图是今天要实现的最终效果: 利用Gallery组件实现的一个横向显示图像列表,可以通过左.右滑动屏幕来切换图像,并加上ImageSwitcher实现一个大图片预览功能. 1.一步一步来吧,首先先解决下上半部分(图像导航) 先来看下效果图,下图是利用Gallery组件实现的一个横向显示图像列表,可以通过左.右滑动屏幕来切换图像.   直接上代码,注释很全. MainActivity.j

安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)

什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Activity中,我们可以合并多个Fragment在一个单独的activity中建立多个UI面板,或

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面

安卓开发复习笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)

菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu). 菜单的实现方式有2种:一种是通过布局文件xml生成菜单,另一种是通过代码生成. 三种菜单内容有点多,不过大体相似,一次性讲完吧,本人偏好代码动态生成,下面就以代码为例. 1.选项菜单(OptionsMenu) 先来看下选项菜单的效果图:   在一个Activity界面中点击手机Menu键,在屏幕下方弹出的菜单

使用FragmentTabHost和ViewPager实现仿微信主界面策划

最近看到很多界面主页都差不多,决定研究研究写出来,以后直接拿来用,不做代码的轮子,多总结,多学习 还是废话少说,先上图 介绍一下我的代码: 首先是布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&quo

IOS开发复习笔记(3)-ARC

1.ARC 当你自己调用了release或retain语句的时候,ARC有效时编译文件会遇到错误,你可以通过-fno-objc-arc和-fobjc-arc两个编译器标志在混搭中支持ARC和非ARC的代码 如下面编译支持ARC,而文件代码不支持ARC # if !__has_feature(objc_arc) //this code do not support to ARC -(void) release{ //release your var } #endif 在ARC工程中集成非ARC的第