【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

时间:2021-10-19 23:57:26

本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗?

最下方有源码的下载地址,几乎源码的每一行都有注释,写的通俗易懂,非常清晰,如有不懂的可以留言,本博主一定尽心尽力,为大家答题解惑,希望大家多多支持,好的,话不多说,让我们回归到今天的正题。

一、实现的效果图

也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似,有图才有真相嘛,呵呵。

【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

二、编码前的准备工作

ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。大家搜下即可。

三、项目结构图

【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

四、具体的编码实现

1、 布局界面比较简单,加入ViewPager组件,以及底部的引导小点,activity_main.xml:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<RelativeLayout

xmlns:android
="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
       
     <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"

/> 
       
     <LinearLayout
        android:id="@+id/ll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="24.0dip"
        android:orientation="horizontal"
        
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:clickable="true"
            android:padding="15.0dip"
            android:src="@drawable/point"/> 
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:clickable="true"
            android:padding="15.0dip"
            android:src="@drawable/point"/> 
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:clickable="true"
            android:padding="15.0dip"
            android:src="@drawable/point"/> 
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:clickable="true"
            android:padding="15.0dip"
            android:src="@drawable/point"/> 
    </LinearLayout
</RelativeLayout>

2、其中小点的图片用一个selector来控制颜色,point.xml:

双击代码全选
1
2
3
4
5
6
<?xml

version
="1.0"

encoding
="UTF-8"?> 
<selector
    <item

android:state_enabled
="true"

android:drawable
="@drawable/point_normal"

/> 
    <item

android:state_enabled
="false"

android:drawable
="@drawable/point_select"

/> 
</selector>

3、 ViewPager适配器代码,ViewPagerAdapter.java:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package

com.yangyu; 
       
import

java.util.ArrayList; 
       
import

android.support.v4.view.PagerAdapter; 
import

android.support.v4.view.ViewPager; 
import

android.view.View; 
       
/**
 *
@author yangyu
 
功能描述:ViewPager适配器,用来绑定数据和view
 */
public

class

ViewPagerAdapter
extends

PagerAdapter { 
           
    //界面列表 
    private

ArrayList<View> views; 
           
    public

ViewPagerAdapter (ArrayList<View> views){ 
        this.views
= views; 
    
              
    /**
     *
获得当前界面数
     */
    @Override
    public

int

getCount() { 
         if

(views !=
null)
             return

views.size(); 
         }       
         return

0

    
       
    /**
     *
初始化position位置的界面
     */
    @Override
    public

Object instantiateItem(View view,
int

position) { 
              
        ((ViewPager)
view).addView(views.get(position),
0); 
              
        return

views.get(position); 
    
           
    /**
     *
判断是否由对象生成界面
     */
    @Override
    public

boolean

isViewFromObject(View view, Object arg1) { 
        return

(view == arg1); 
    
       
    /**
     *
销毁position位置的界面
     */
    @Override
    public

void

destroyItem(View view,
int

position, Object arg2) { 
        ((ViewPager)
view).removeView(views.get(position));        
    
}

4、主程序入口类,MainActivity.java:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package

com.yangyu; 
       
import

java.util.ArrayList; 
       
import

android.app.Activity; 
import

android.os.Bundle; 
import

android.support.v4.view.ViewPager; 
import

android.support.v4.view.ViewPager.OnPageChangeListener; 
import

android.view.View; 
import

android.view.View.OnClickListener; 
import

android.widget.ImageView; 
import

android.widget.LinearLayout; 
       
import

com.example.myguideview01.R; 
       
/**
 *
@author yangyu
 
功能描述:主程序入口类
 */
public

class

MainActivity
extends

Activity
implements

OnClickListener,OnPageChangeListener { 
    //定义ViewPager对象 
    private

ViewPager viewPager; 
           
    //定义ViewPager适配器 
    private

ViewPagerAdapter vpAdapter; 
           
    //定义一个ArrayList来存放View 
    private

ArrayList<View> views; 
       
    //引导图片资源 
        private

static

final

int
[]
pics = {R.drawable.guide1,R.drawable.guide2,R.drawable.guide3,R.drawable.guide4}; 
           
        //底部小点的图片 
        private

ImageView[] points; 
           
        //记录当前选中位置 
        private

int

currentIndex; 
           
    @Override
    protected

void

onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
               
        initView(); 
               
        initData();  
    
       
    /**
     *
初始化组件
     */
    private

void

initView(){ 
        //实例化ArrayList对象 
        views
=
new

ArrayList<View>(); 
               
        //实例化ViewPager 
        viewPager
= (ViewPager) findViewById(R.id.viewpager); 
               
        //实例化ViewPager适配器 
        vpAdapter
=
new

ViewPagerAdapter(views); 
    
           
    /**
     *
初始化数据
     */
    private

void

initData(){ 
        //定义一个布局并设置参数 
        LinearLayout.LayoutParams
mParams =
new

LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, 
                                                                          LinearLayout.LayoutParams.FILL_PARENT); 
              
        //初始化引导图片列表 
        for(int

i=
0;
i<pics.length; i++) { 
            ImageView
iv =
new

ImageView(
this); 
            iv.setLayoutParams(mParams); 
            iv.setImageResource(pics[i]); 
            views.add(iv); 
        }  
               
        //设置数据 
        viewPager.setAdapter(vpAdapter); 
        //设置监听 
        viewPager.setOnPageChangeListener(this); 
               
        //初始化底部小点 
        initPoint(); 
    
           
    /**
     *
初始化底部小点
     */
    private

void

initPoint(){ 
        LinearLayout
linearLayout = (LinearLayout) findViewById(R.id.ll);        
               
        points
=
new

ImageView[pics.length]; 
       
        //循环取得小点图片 
        for

(
int

i =
0;
i < pics.length; i++) { 
            //得到一个LinearLayout下面的每一个子元素 
            points[i]
= (ImageView) linearLayout.getChildAt(i); 
            //默认都设为灰色 
            points[i].setEnabled(true); 
            //给每个小点设置监听 
            points[i].setOnClickListener(this); 
            //设置位置tag,方便取出与当前位置对应 
            points[i].setTag(i); 
        
               
        //设置当面默认的位置 
        currentIndex
=
0
        //设置为白色,即选中状态 
        points[currentIndex].setEnabled(false); 
    
           
    /**
     *
当滑动状态改变时调用
     */
    @Override
    public

void

onPageScrollStateChanged(
int

arg0) { 
       
    
           
    /**
     *
当当前页面被滑动时调用
     */
       
    @Override
    public

void

onPageScrolled(
int

arg0,
float

arg1,
int

arg2) { 
       
    
           
    /**
     *
当新的页面被选中时调用
     */
       
    @Override
    public

void

onPageSelected(
int

position) { 
        //设置底部小点选中状态 
        setCurDot(position); 
    
       
    /**
     *
通过点击事件来切换当前的页面
     */
    @Override
    public

void

onClick(View v) { 
         int

position = (Integer)v.getTag(); 
         setCurView(position); 
         setCurDot(position);        
    
       
    /**
     *
设置当前页面的位置
     */
    private

void

setCurView(
int

position){ 
         if

(position <
0

|| position >= pics.length) { 
             return
         
         viewPager.setCurrentItem(position); 
     
       
     /**
     *
设置当前的小点的位置
     */
    private

void

setCurDot(
int

positon){ 
         if

(positon <
0

|| positon > pics.length -
1

|| currentIndex == positon) { 
             return
         
         points[positon].setEnabled(false); 
         points[currentIndex].setEnabled(true); 
       
         currentIndex
= positon; 
     }   
}

这篇主要是让大家能够实现一个简单的例子,让你的程序先动起来,才有信心和勇气挑战更复杂的UI设计和开发,在后面的几篇章节中,博主也会以同样生动和富有激情的讲解,给大家带来更加的复杂的演示和代码,如仿微信、和人人网的引导界面的开发,加入了动画的效果,运行起来也会更炫一点。

源码下载地址

来源: csdn   作者:yangyu20121224   

【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面的更多相关文章

  1. 【Android UI设计与开发】5&period;底部菜单栏(二)使用Fragment实现底部菜单栏

    既然 Fragment 取代了TabActivity,当然 TabActivity 的能实现的菜单栏,Fragment 当然也能实现.主要其实就是通过菜单栏的点击事件切换 Fragment 的显示和隐 ...

  2. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

  3. 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar

    原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...

  4. 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解

    做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受 ...

  5. 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5&period;9&period;2最新版引导界面

    这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...

  6. 【转】【Android UI设计与开发】第07期:底部菜单栏(二)Fragment的详细介绍和使用方法

    原始地址:http://blog.csdn.net/yangyu20121224/article/category/1431917/1 由于TabActivity在Android4.0以后已经被完全弃 ...

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

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

  8. 【Android UI设计与开发】3&period;引导界面(三)实现应用程序只启动一次引导界面

    大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...

  9. 【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例

    通过上一篇文章的讲解,相信大家对于开源项目SlidingMenu都有了一个比较初步的了解(不了解的可以参考上 一篇文章),那么从这一章开始,博主将会以SlidingMenu为重心,给大家带来非常丰富的 ...

随机推荐

  1. angularJs &comma; json,html片段,bootstrap timepicker angular

    css .demotest { width: %; height: auto; overflow: auto; position: relative; margin: auto; margin-top ...

  2. GIT和SVN之间的五个基本区别

    GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征.所以,这篇文章的主要目的就是 ...

  3. Python Web&period;py

    安装Web.py root@bt:~# sudo pip install web.py Downloading/unpacking web.py Downloading web.py-0.37.tar ...

  4. 【Python】Coding the Matrix&colon;Week 5 Perspective Lab

    这个Lab的内容光是说明就有7页之巨,我反复看了很久才看懂一点点,Lab主要完成的是从不同坐标系表示之间变换的方法. 原始的图片,从Camera basis的表示转换成WhiteBoard basis ...

  5. Leetcode Pasacl&&num;39&semi;sTriangle

    对于Vector的用法,实在是知道的太少,算法思想比较简单,核心也就一行代码,但是实现错误就显示平时代码的不熟悉. Given numRows, generate the first numRows ...

  6. MongoDB &dollar;type条件操作符

    描述 在本章节中,我们将继续讨论MongoDB中条件操作符 $type. $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 ...

  7. Git基本命令 -- 历史

    历史. 收先需要了解一下git log命令, 使用git的帮助看看: git help log: 执行该命令后, 我的win10弹出来一个html页面, 里面是git log命令的帮助: 首先看看gi ...

  8. &lbrack;转&rsqb;使用jenkins实现持续集成

    本文转自:https://www.cnblogs.com/zishengY/p/7170656.html 一.jenkins 介绍 它是一个自动化的周期性的集成测试过程,从检出代码.编译构建.运行测试 ...

  9. Linux命令第四篇

    作业四: 1)  新建目录/test/dir,属主为tom,数组为group1,/test目录的权限为777 # useradd tom [root@localhost /]# groupadd gr ...

  10. 转:scrollWidth&comma;clientWidth&comma;offsetWidth的区别

    scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包滚动条等边线,会随对象显示大小的变化而改变. off ...