Android UI设计与开发之使用ViewPager实现欢迎引导页面
发布时间 - 2026-01-11 03:01:39 点击率:次本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗?

最下方有源码的下载地址,几乎源码的每一行都有注释,写的通俗易懂,非常清晰,如有不懂的可以留言,本博主一定尽心尽力,为大家答题解惑,希望大家多多支持,好的,话不多说,让我们回归到今天的正题。
一、实现的效果图
也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实现的效果类似,有图才有真相嘛,呵呵。
二、编码前的准备工作
ViewPager是Android3.0之后提供的新特性,所以要想让你的应用向下兼容就必须要Android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包。大家搜下即可。
三、项目结构图
四、具体的编码实现
1、 布局界面比较简单,加入ViewPager组件,以及底部的引导小点,activity_main.xml:
<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:
<?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <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:
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:
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设计和开发,在后面的几篇章节中,博主也会以同样生动和富有激情的讲解,给大家带来更加的复杂的演示和代码,如仿微信、和人人网的引导界面的开发,加入了动画的效果,运行起来也会更炫一点。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# UI
# ViewPager
# 引导页面
# Android实现渐变启动页和带有指示器的引导页
# Android自定义控件打造绚丽平行空间引导页
# Android开发实现的ViewPager引导页功能(动态加载指示器)详解
# Android控件ViewPager实现带有动画的引导页
# Android引导页面的简单实现
# Android实现绕球心旋转的引导页效果
# Android开发实战之漂亮的ViewPager引导页
# RxJava两步打造华丽的Android引导页
# Android使用ViewPager实现启动引导页
# Android使用ViewPager完成app引导页
# 主程序
# 才有
# 会以
# 大家多多
# 都有
# 也会
# 让我们
# 必须要
# 下载地址
# 如有
# 结构图
# 不懂
# 设为
# 这是一个
# 要想
# 达到了
# 给大家
# 这样一个
# 事半功倍
# 循序渐进
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高性价比服务器租赁——企业级配置与24小时运维服务
linux写shell需要注意的问题(必看)
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何用PHP快速搭建CMS系统?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
详解Huffman编码算法之Java实现
微信推文制作网站有哪些,怎么做微信推文,急?
Android仿QQ列表左滑删除操作
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
phpredis提高消息队列的实时性方法(推荐)
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
Laravel如何实现事件和监听器?(Event & Listener实战)
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
黑客入侵网站服务器的常见手法有哪些?
原生JS实现图片轮播切换效果
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何配置Horizon来管理队列?(安装和使用)
企业网站制作这些问题要关注
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
佛山企业网站制作公司有哪些,沟通100网上服务官网?
打造顶配客厅影院,这份100寸电视推荐名单请查收
Java解压缩zip - 解压缩多个文件或文件夹实例
如何快速完成中国万网建站详细流程?
详解jQuery中基本的动画方法
如何用免费手机建站系统零基础打造专业网站?
BootStrap整体框架之基础布局组件
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何实现javascript表单验证_正则表达式有哪些实用技巧
EditPlus中的正则表达式 实战(1)
大连 网站制作,大连天途有线官网?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Linux后台任务运行方法_nohup与&使用技巧【技巧】
js代码实现下拉菜单【推荐】
如何在IIS中新建站点并配置端口与IP地址?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Python结构化数据采集_字段抽取解析【教程】
魔方云NAT建站如何实现端口转发?
Laravel如何处理CORS跨域请求?(配置示例)
高防服务器租用如何选择配置与防御等级?
轻松掌握MySQL函数中的last_insert_id()
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
如何用y主机助手快速搭建网站?
javascript基于原型链的继承及call和apply函数用法分析
下一篇:Linux进程崩溃及解决方案
下一篇:Linux进程崩溃及解决方案

