我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等。
一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单,但在安卓上如何实现呢。
今天就和大家一起来学习用官方v4支持包下的ViewPager来实现这个效果。

先上图:

下面是我的实现,一个xml布局,一个GuideActivity和一个GuidePageAdapter.

先上XML.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context="com.example.nanchen.guidepagedemo.GuideActivity">
  8.  
  9. <android.support.v4.view.ViewPager
  10. android:id="@+id/guide_vp"
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent">
  13. </android.support.v4.view.ViewPager>
  14.  
  15. <LinearLayout
  16. android:id="@+id/guide_ll_point"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:orientation="horizontal"
  20. android:layout_alignParentBottom="true"
  21. android:layout_marginBottom="40dp"
  22. android:gravity="center_horizontal">
  23. </LinearLayout>
  24.  
  25. <ImageButton
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:id="@+id/guide_ib_start"
  29. android:src="@mipmap/btn_start"
  30. android:layout_centerHorizontal="true"
  31. android:layout_above="@+id/guide_ll_point"
  32. android:background="@null"
  33. android:visibility="gone"/>
  34. </RelativeLayout>

  

在准备一个Adapter,这个没什么好说的、

  1. package com.example.nanchen.guidepagedemo;
  2.  
  3. import android.support.v4.view.PagerAdapter;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6.  
  7. import java.util.List;
  8.  
  9. /**
  10. * Created by 南尘 on 2016/7/10.
  11. */
  12. public class GuidePageAdapter extends PagerAdapter {
  13.  
  14. private List<View> viewList;
  15.  
  16. public GuidePageAdapter(List<View> viewList) {
  17. this.viewList = viewList;
  18. }
  19.  
  20. /**
  21. * @return 返回页面的个数
  22. */
  23. @Override
  24. public int getCount() {
  25. if (viewList != null){
  26. return viewList.size();
  27. }
  28. return 0;
  29. }
  30.  
  31. /**
  32. * 判断对象是否生成界面
  33. * @param view
  34. * @param object
  35. * @return
  36. */
  37. @Override
  38. public boolean isViewFromObject(View view, Object object) {
  39. return view == object;
  40. }
  41.  
  42. /**
  43. * 初始化position位置的界面
  44. * @param container
  45. * @param position
  46. * @return
  47. */
  48. @Override
  49. public Object instantiateItem(ViewGroup container, int position) {
  50. container.addView(viewList.get(position));
  51. return viewList.get(position);
  52. }
  53.  
  54. @Override
  55. public void destroyItem(ViewGroup container, int position, Object object) {
  56. container.removeView(viewList.get(position));
  57. }
  58. }

  

最后就是我们的Activity了

  1. package com.example.nanchen.guidepagedemo;
  2.  
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.support.v4.view.ViewPager;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.view.Window;
  10. import android.widget.ImageButton;
  11. import android.widget.ImageView;
  12. import android.widget.LinearLayout;
  13.  
  14. import java.util.ArrayList;
  15. import java.util.List;
  16.  
  17. /**
  18. * 实现首次启动的引导页面
  19. */
  20. public class GuideActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{
  21.  
  22. private ViewPager vp;
  23. private int []imageIdArray;//图片资源的数组
  24. private List<View> viewList;//图片资源的集合
  25. private ViewGroup vg;//放置圆点
  26.  
  27. //实例化原点View
  28. private ImageView iv_point;
  29. private ImageView []ivPointArray;
  30.  
  31. //最后一页的按钮
  32. private ImageButton ib_start;
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
  37. setContentView(R.layout.activity_guide);
  38.  
  39. ib_start = (ImageButton) findViewById(R.id.guide_ib_start);
  40. ib_start.setOnClickListener(new View.OnClickListener() {
  41. @Override
  42. public void onClick(View v) {
  43. startActivity(new Intent(GuideActivity.this,MainActivity.class));
  44. finish();
  45. }
  46. });
  47.  
  48. //加载ViewPager
  49. initViewPager();
  50.  
  51. //加载底部圆点
  52. initPoint();
  53. }
  54.  
  55. /**
  56. * 加载底部圆点
  57. */
  58. private void initPoint() {
  59. //这里实例化LinearLayout
  60. vg = (ViewGroup) findViewById(R.id.guide_ll_point);
  61. //根据ViewPager的item数量实例化数组
  62. ivPointArray = new ImageView[viewList.size()];
  63. //循环新建底部圆点ImageView,将生成的ImageView保存到数组中
  64. int size = viewList.size();
  65. for (int i = 0;i<size;i++){
  66. iv_point = new ImageView(this);
  67. iv_point.setLayoutParams(new ViewGroup.LayoutParams(20,20));
  68. iv_point.setPadding(30,0,30,0);//left,top,right,bottom
  69. ivPointArray[i] = iv_point;
  70. //第一个页面需要设置为选中状态,这里采用两张不同的图片
  71. if (i == 0){
  72. iv_point.setBackgroundResource(R.mipmap.full_holo);
  73. }else{
  74. iv_point.setBackgroundResource(R.mipmap.empty_holo);
  75. }
  76. //将数组中的ImageView加入到ViewGroup
  77. vg.addView(ivPointArray[i]);
  78. }
  79.  
  80. }
  81.  
  82. /**
  83. * 加载图片ViewPager
  84. */
  85. private void initViewPager() {
  86. vp = (ViewPager) findViewById(R.id.guide_vp);
  87. //实例化图片资源
  88. imageIdArray = new int[]{R.mipmap.guide1,R.mipmap.guide2,R.mipmap.guide3};
  89. viewList = new ArrayList<>();
  90. //获取一个Layout参数,设置为全屏
  91. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
  92. LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
  93.  
  94. //循环创建View并加入到集合中
  95. int len = imageIdArray.length;
  96. for (int i = 0;i<len;i++){
  97. //new ImageView并设置全屏和图片资源
  98. ImageView imageView = new ImageView(this);
  99. imageView.setLayoutParams(params);
  100. imageView.setBackgroundResource(imageIdArray[i]);
  101.  
  102. //将ImageView加入到集合中
  103. viewList.add(imageView);
  104. }
  105.  
  106. //View集合初始化好后,设置Adapter
  107. vp.setAdapter(new GuidePageAdapter(viewList));
  108. //设置滑动监听
  109. vp.setOnPageChangeListener(this);
  110. }
  111.  
  112. @Override
  113. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  114.  
  115. }
  116.  
  117. /**
  118. * 滑动后的监听
  119. * @param position
  120. */
  121. @Override
  122. public void onPageSelected(int position) {
  123. //循环设置当前页的标记图
  124. int length = imageIdArray.length;
  125. for (int i = 0;i<length;i++){
  126. ivPointArray[position].setBackgroundResource(R.mipmap.full_holo);
  127. if (position != i){
  128. ivPointArray[i].setBackgroundResource(R.mipmap.empty_holo);
  129. }
  130. }
  131.  
  132. //判断是否是最后一页,若是则显示按钮
  133. if (position == imageIdArray.length - 1){
  134. ib_start.setVisibility(View.VISIBLE);
  135. }else {
  136. ib_start.setVisibility(View.GONE);
  137. }
  138. }
  139.  
  140. @Override
  141. public void onPageScrollStateChanged(int state) {
  142.  
  143. }
  144. }

  

总的来说实现流程比较简单。

1)先加载ViewPager,新建ImageView并添加到View集合中,然后设置Adapter并显示。

2)然后加载LinearLayout,放置原点图片,同样新建ImageView设置背景后放在圆点图集合中。

3)最后设置ViewPager的滑动监听事件,在滑动完成的监听OnPageSelected方法中,设置对应的圆点为选中,如果是最后一页,则显示按钮。

安卓第一次启动引导页使用ViewPager实现的更多相关文章

  1. HybridApp启动引导页的实现

    有一种帅叫做长话短说,@孙红雷,--这可以叫做“短帅”吗,^_^ 首先说下思路,既然是Hybrid APP, 那就是可以用html的方式实现,启动引导页比较常见的展示方式是滑动,那么我们就可以使用图片 ...

  2. IOS 一句代码搞定启动引导页

    前言引导页,一个酷炫的页面,自从微博用了之后一下就火起来了,对于现在来说一个app如果没有引导页似乎总显那么不接地气,那么为了让我们的app也“高大上”一次,我写了一个demo来实现启动引导页的实现, ...

  3. Android:启动引导页实现

    前言 基本上现在所有的应用都会有一个欢迎界面,在欢迎界面对应用做一个整体的介绍,然后在跳入到主界面,这次要说的这个引导页就是带翻页的引导页.效果如下所示

  4. ionic之应用首次启动引导页

    用户首次启动app先进入引导页,localstroge记录状态,下次启动应用不再显示引导页. HTML: <html> <head> <meta charset=&quo ...

  5. 自定义App首次启动引导页

    代码如下 #import"ZBGuidePageView.h" @interfaceZBGuidePageView()<UIScrollViewDelegate> @p ...

  6. 使用Webview实现app启动引导页

    效果如下: 首先需要一个html页面及相应的js和css支持放在assets目录下(如果没有这个目录请项目上右键-new-folder-assets) 配置权限: <uses-permissio ...

  7. [置顶] Android App引导页这些坑你自己犯过吗?

    场景:测试机:华为荣耀6x 今天我自己掉入一个很蠢蠢的坑,一个引导页搞了20多分钟,不管我怎么测试用真机还是模拟器都无法运行,但是我写的demo完全没问题,好无语,我都怀疑我是不是搞android,我 ...

  8. Android App引导页这些坑你自己犯过吗?

    场景:測试机:华为荣耀6x 今天我自己掉入一个非常蠢蠢的坑,一个引导页搞了20多分钟.无论我怎么測试用真机还是模拟器都无法执行,可是我写的demo全然没问题,好无语,我都怀疑我是不是搞android, ...

  9. ViewPager实现引导页(添加导航点,判断是否第一次进入主界面)

    1.引导页的4个界面布局,里面加载一张背景图片 插入到guide的界面布局中(这里不用fragment) guide_background_fragment1.xml <?xml version ...

随机推荐

  1. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  2. node-sass 安装失败的解决措施

    在测试gulp-webapp的时候遇到了styles不能被正常编译的问题,究其原因是node-sass没有被正常安装. 根本原因是国内网络的原因. 最终的解决方法是通过淘宝的npm镜像安装node-s ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. 简单搭建 nuget 内部服务器

    搭建 nuget 内部服务器,最好的方式是使用 ProGet,参考博文<用 ProGet 搭建内部的 NuGet 服务器>,好处非常多,但需要使用 SQL Server 数据库,如果不想使 ...

  5. EntityFramework.Extended 支持 MySql

    EntityFramework.Extended 默认不支持 MySql,需要配置如下代码: [DbConfigurationType(typeof(DbContextConfiguration))] ...

  6. js参数arguments的理解

    原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...

  7. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  8. BPM助力企业数字化转型

    自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...

  9. Android Studio快捷键

      一.android studio 默认快捷键 刚开始接触一款开发软件,想必很想了解它的快捷方式,这会对你的编程起到很好的帮助,提高工作效率,接下来给你介绍下Android Studio一些常用的快 ...

  10. MySQL 优化之 ICP (index condition pushdown:索引条件下推)

    ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...