热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

RxJava两步打造华丽的Android引导页

如今,移动应用对首次使用的用户呈现欢迎页已经越来越普遍了。这样做的目的就是向用户介绍并展示我们的应用。本文给Android开发的引导页面提供了很多参考,非常值得一读。

前言

之前的一篇文章:基于RxJava实现酷炫启动页 中,我们尝试了用RxJava实现酷炫的启动页,今天我们在此基础上加入首次使用APP时的引导页功能。

效果如下图:

思路:思路其实很简单,就是在WelcomeActivity setContentView()之前判断是否是首次打开APP,若是,则去启动引导页(WelcomeGuideActivity)并return;若不是,则直接setContentView(),然后启动动画再启动MainActivity

一、WelcomeActivity中判断是否是第一次启动

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 判断是否是第一次开启应用
    boolean isFirstOpen = SharedPreferencesUtil.getBoolean(this, SharedPreferencesUtil.FIRST_OPEN, true);
    // 如果是第一次启动,则先进入功能引导页
    if (isFirstOpen) {
      Intent intent = new Intent(this, WelcomeGuideActivity.class);
      startActivity(intent);
      finish();
      return;
    }

    // 如果不是第一次启动app,则正常显示启动屏
    setContentView(R.layout.activity_welcome);
    ButterKnife.bind(this);
    startMainActivity();
  }

我们判断是否是第一次打开APP是用了SharedPreferences,我们这里对他进行了一下简单封装,代码如下:

/**
 * Created by xialo on 2016/7/25.
 */
public class SharedPreferencesUtil {

  private static final String spFileName = "welcomePage";
  public static final String FIRST_OPEN = "first_open";

  public static Boolean getBoolean(Context context, String strKey,
                   Boolean strDefault) {//strDefault  boolean: Value to return if this preference does not exist.
    SharedPreferences setPreferences = context.getSharedPreferences(
        spFileName, Context.MODE_PRIVATE);
    Boolean result = setPreferences.getBoolean(strKey, strDefault);
    return result;
  }

  public static void putBoolean(Context context, String strKey,
                 Boolean strData) {
    SharedPreferences activityPreferences = context.getSharedPreferences(
        spFileName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = activityPreferences.edit();
    editor.putBoolean(strKey, strData);
    editor.commit();
  }

}

二、WelcomeGuideActivity中,我们使用ViewPager以加载多个引导页面使其可以左右滑动

不多说,请看WelcomeGuideActivity.java代码:

/**
 * Created by xialo on 2016/7/25.
 */
public class WelcomeGuideActivity extends Activity implements View.OnClickListener {
  private ViewPager vp;
  private GuideViewPagerAdapter adapter;
  private List views;
  private Button startBtn;

  // 引导页图片资源
  private static final int[] pics = { R.layout.guide_view1,
      R.layout.guide_view2, R.layout.guide_view3};

  // 底部小点图片
  private ImageView[] dots;

  // 记录当前选中位置
  private int currentIndex;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_guide);

    views = new ArrayList();

    // 初始化引导页视图列表
    for (int i = 0; i = pics.length) {
      return;
    }
    vp.setCurrentItem(position);
  }

  /**
   * 设置当前指示点
   *
   * @param position
   */
  private void setCurDot(int position) {
    if (position <0 || position > pics.length || currentIndex == position) {
      return;
    }
    dots[position].setEnabled(true);
    dots[currentIndex].setEnabled(false);
    currentIndex = position;
  }

  @Override
  public void onClick(View v) {
    if (v.getTag().equals("enter")) {
      enterMainActivity();
      return;
    }

    int position = (Integer) v.getTag();
    setCurView(position);
    setCurDot(position);
  }


  private void enterMainActivity() {
    Intent intent = new Intent(WelcomeGuideActivity.this,
        WelcomeActivity.class);
    startActivity(intent);
    SharedPreferencesUtil.putBoolean(WelcomeGuideActivity.this, SharedPreferencesUtil.FIRST_OPEN, false);
    finish();
  }

  private class PageChangeListener implements ViewPager.OnPageChangeListener {
    @Override
    public void onPageScrollStateChanged(int position) {

    }

    @Override
    public void onPageScrolled(int position, float arg1, int arg2) {

    }

    @Override
    public void onPageSelected(int position) {
      // 设置底部小点选中状态
      setCurDot(position);
    }

  }
}

我们用了三个页面guide_view1、guide_view2、guide_view3作为引导页面,布局类似,只是guide_view3多了个点击进入的Button

以下是guide_view3.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;>

WelcomeGuideActivity中值得注意的是该Button点击事件的处理,在点击Button后我们并没有直接进入MainActivity,而是先把SharedPreferences中标记是否第一次进入的布尔值设为false,而后再次进入WelcomeActivity,此时WelcomeActivity会直接setContentView()然后启动动画,进入MainActivity

以上,我们华丽丽的引导页就完成了。希望本文中能对你的引导页提供帮助,和在大家学习Android开发中有所参考,谢谢大家对的支持。


推荐阅读
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Visual Studio 2019 安装指南
    作为一名拥有三年经验的程序员,由于长期专注于C语言,我意识到自己的技术栈过于单一。在转型为Android驱动开发工程师后,这种局限性更加明显。本文将介绍如何安装Visual Studio 2019,并配置C++开发环境,以帮助读者拓宽技术视野。 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 华为捐赠欧拉操作系统,承诺不推商用版
    华为近日宣布将欧拉开源操作系统捐赠给开放原子开源基金会,并承诺不会推出欧拉的商用发行版。此举旨在推动欧拉和鸿蒙操作系统的全场景融合与生态发展。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • 解决SQL Server数据库sa登录名无法连接的问题
    在安装SQL Server数据库后,使用Windows身份验证成功,但使用SQL Server身份验证时遇到问题。本文将介绍如何通过设置sa登录名的密码、启用登录名状态以及开启TCP协议来解决这一问题。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
author-avatar
EksManhn_188
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有