安卓第一次启动引导页使用ViewPager实现
我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等。
一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单,但在安卓上如何实现呢。
今天就和大家一起来学习用官方v4支持包下的ViewPager来实现这个效果。
先上图:
下面是我的实现,一个xml布局,一个GuideActivity和一个GuidePageAdapter.
先上XML.
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.nanchen.guidepagedemo.GuideActivity">
- <android.support.v4.view.ViewPager
- android:id="@+id/guide_vp"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- </android.support.v4.view.ViewPager>
- <LinearLayout
- android:id="@+id/guide_ll_point"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_alignParentBottom="true"
- android:layout_marginBottom="40dp"
- android:gravity="center_horizontal">
- </LinearLayout>
- <ImageButton
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/guide_ib_start"
- android:src="@mipmap/btn_start"
- android:layout_centerHorizontal="true"
- android:layout_above="@+id/guide_ll_point"
- android:background="@null"
- android:visibility="gone"/>
- </RelativeLayout>
在准备一个Adapter,这个没什么好说的、
- package com.example.nanchen.guidepagedemo;
- import android.support.v4.view.PagerAdapter;
- import android.view.View;
- import android.view.ViewGroup;
- import java.util.List;
- /**
- * Created by 南尘 on 2016/7/10.
- */
- public class GuidePageAdapter extends PagerAdapter {
- private List<View> viewList;
- public GuidePageAdapter(List<View> viewList) {
- this.viewList = viewList;
- }
- /**
- * @return 返回页面的个数
- */
- @Override
- public int getCount() {
- if (viewList != null){
- return viewList.size();
- }
- return 0;
- }
- /**
- * 判断对象是否生成界面
- * @param view
- * @param object
- * @return
- */
- @Override
- public boolean isViewFromObject(View view, Object object) {
- return view == object;
- }
- /**
- * 初始化position位置的界面
- * @param container
- * @param position
- * @return
- */
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- container.addView(viewList.get(position));
- return viewList.get(position);
- }
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- container.removeView(viewList.get(position));
- }
- }
最后就是我们的Activity了
- package com.example.nanchen.guidepagedemo;
- import android.content.Intent;
- import android.os.Bundle;
- import android.support.v4.view.ViewPager;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.Window;
- import android.widget.ImageButton;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 实现首次启动的引导页面
- */
- public class GuideActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener{
- private ViewPager vp;
- private int []imageIdArray;//图片资源的数组
- private List<View> viewList;//图片资源的集合
- private ViewGroup vg;//放置圆点
- //实例化原点View
- private ImageView iv_point;
- private ImageView []ivPointArray;
- //最后一页的按钮
- private ImageButton ib_start;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.activity_guide);
- ib_start = (ImageButton) findViewById(R.id.guide_ib_start);
- ib_start.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startActivity(new Intent(GuideActivity.this,MainActivity.class));
- finish();
- }
- });
- //加载ViewPager
- initViewPager();
- //加载底部圆点
- initPoint();
- }
- /**
- * 加载底部圆点
- */
- private void initPoint() {
- //这里实例化LinearLayout
- vg = (ViewGroup) findViewById(R.id.guide_ll_point);
- //根据ViewPager的item数量实例化数组
- ivPointArray = new ImageView[viewList.size()];
- //循环新建底部圆点ImageView,将生成的ImageView保存到数组中
- int size = viewList.size();
- for (int i = 0;i<size;i++){
- iv_point = new ImageView(this);
- iv_point.setLayoutParams(new ViewGroup.LayoutParams(20,20));
- iv_point.setPadding(30,0,30,0);//left,top,right,bottom
- ivPointArray[i] = iv_point;
- //第一个页面需要设置为选中状态,这里采用两张不同的图片
- if (i == 0){
- iv_point.setBackgroundResource(R.mipmap.full_holo);
- }else{
- iv_point.setBackgroundResource(R.mipmap.empty_holo);
- }
- //将数组中的ImageView加入到ViewGroup
- vg.addView(ivPointArray[i]);
- }
- }
- /**
- * 加载图片ViewPager
- */
- private void initViewPager() {
- vp = (ViewPager) findViewById(R.id.guide_vp);
- //实例化图片资源
- imageIdArray = new int[]{R.mipmap.guide1,R.mipmap.guide2,R.mipmap.guide3};
- viewList = new ArrayList<>();
- //获取一个Layout参数,设置为全屏
- LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
- //循环创建View并加入到集合中
- int len = imageIdArray.length;
- for (int i = 0;i<len;i++){
- //new ImageView并设置全屏和图片资源
- ImageView imageView = new ImageView(this);
- imageView.setLayoutParams(params);
- imageView.setBackgroundResource(imageIdArray[i]);
- //将ImageView加入到集合中
- viewList.add(imageView);
- }
- //View集合初始化好后,设置Adapter
- vp.setAdapter(new GuidePageAdapter(viewList));
- //设置滑动监听
- vp.setOnPageChangeListener(this);
- }
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- }
- /**
- * 滑动后的监听
- * @param position
- */
- @Override
- public void onPageSelected(int position) {
- //循环设置当前页的标记图
- int length = imageIdArray.length;
- for (int i = 0;i<length;i++){
- ivPointArray[position].setBackgroundResource(R.mipmap.full_holo);
- if (position != i){
- ivPointArray[i].setBackgroundResource(R.mipmap.empty_holo);
- }
- }
- //判断是否是最后一页,若是则显示按钮
- if (position == imageIdArray.length - 1){
- ib_start.setVisibility(View.VISIBLE);
- }else {
- ib_start.setVisibility(View.GONE);
- }
- }
- @Override
- public void onPageScrollStateChanged(int state) {
- }
- }
总的来说实现流程比较简单。
1)先加载ViewPager,新建ImageView并添加到View集合中,然后设置Adapter并显示。
2)然后加载LinearLayout,放置原点图片,同样新建ImageView设置背景后放在圆点图集合中。
3)最后设置ViewPager的滑动监听事件,在滑动完成的监听OnPageSelected方法中,设置对应的圆点为选中,如果是最后一页,则显示按钮。
安卓第一次启动引导页使用ViewPager实现的更多相关文章
- HybridApp启动引导页的实现
有一种帅叫做长话短说,@孙红雷,--这可以叫做“短帅”吗,^_^ 首先说下思路,既然是Hybrid APP, 那就是可以用html的方式实现,启动引导页比较常见的展示方式是滑动,那么我们就可以使用图片 ...
- IOS 一句代码搞定启动引导页
前言引导页,一个酷炫的页面,自从微博用了之后一下就火起来了,对于现在来说一个app如果没有引导页似乎总显那么不接地气,那么为了让我们的app也“高大上”一次,我写了一个demo来实现启动引导页的实现, ...
- Android:启动引导页实现
前言 基本上现在所有的应用都会有一个欢迎界面,在欢迎界面对应用做一个整体的介绍,然后在跳入到主界面,这次要说的这个引导页就是带翻页的引导页.效果如下所示
- ionic之应用首次启动引导页
用户首次启动app先进入引导页,localstroge记录状态,下次启动应用不再显示引导页. HTML: <html> <head> <meta charset=&quo ...
- 自定义App首次启动引导页
代码如下 #import"ZBGuidePageView.h" @interfaceZBGuidePageView()<UIScrollViewDelegate> @p ...
- 使用Webview实现app启动引导页
效果如下: 首先需要一个html页面及相应的js和css支持放在assets目录下(如果没有这个目录请项目上右键-new-folder-assets) 配置权限: <uses-permissio ...
- [置顶]
Android App引导页这些坑你自己犯过吗?
场景:测试机:华为荣耀6x 今天我自己掉入一个很蠢蠢的坑,一个引导页搞了20多分钟,不管我怎么测试用真机还是模拟器都无法运行,但是我写的demo完全没问题,好无语,我都怀疑我是不是搞android,我 ...
- Android App引导页这些坑你自己犯过吗?
场景:測试机:华为荣耀6x 今天我自己掉入一个非常蠢蠢的坑,一个引导页搞了20多分钟.无论我怎么測试用真机还是模拟器都无法执行,可是我写的demo全然没问题,好无语,我都怀疑我是不是搞android, ...
- ViewPager实现引导页(添加导航点,判断是否第一次进入主界面)
1.引导页的4个界面布局,里面加载一张背景图片 插入到guide的界面布局中(这里不用fragment) guide_background_fragment1.xml <?xml version ...
随机推荐
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- node-sass 安装失败的解决措施
在测试gulp-webapp的时候遇到了styles不能被正常编译的问题,究其原因是node-sass没有被正常安装. 根本原因是国内网络的原因. 最终的解决方法是通过淘宝的npm镜像安装node-s ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- 简单搭建 nuget 内部服务器
搭建 nuget 内部服务器,最好的方式是使用 ProGet,参考博文<用 ProGet 搭建内部的 NuGet 服务器>,好处非常多,但需要使用 SQL Server 数据库,如果不想使 ...
- EntityFramework.Extended 支持 MySql
EntityFramework.Extended 默认不支持 MySql,需要配置如下代码: [DbConfigurationType(typeof(DbContextConfiguration))] ...
- js参数arguments的理解
原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
- BPM助力企业数字化转型
自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...
- Android Studio快捷键
一.android studio 默认快捷键 刚开始接触一款开发软件,想必很想了解它的快捷方式,这会对你的编程起到很好的帮助,提高工作效率,接下来给你介绍下Android Studio一些常用的快 ...
- MySQL 优化之 ICP (index condition pushdown:索引条件下推)
ICP技术是在MySQL5.6中引入的一种索引优化技术.它能减少在使用 二级索引 过滤where条件时的回表次数 和 减少MySQL server层和引擎层的交互次数.在索引组织表中,使用二级索引进行 ...