安卓第一次启动引导页使用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 ...
随机推荐
- Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境
一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- ABP文档 - 本地化
文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...
- div实现自适应高度的textarea,实现angular双向绑定
相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...
- 在Sublime Text 3上安装代码格式化插件CodeFormatter
1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- 基于RN开发的一款视频配音APP(开源)
在如今React.ng.vue三分天下的格局下,不得不让自己加快学习的脚步.虽然经常会陷入各种迷茫,学得越多会发现不会的东西也被无限放大,不过能用新的技术作出一些小项目小Demo还是会给自己些许自信与 ...
- iOS微信里打开app,Universal Links
这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...
- "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案
今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...
- 如何理解javaSript中函数的参数是按值传递
本文是我基于红宝书<Javascript高级程序设计>中的第四章,4.1.3传递参数小节P70,进一步理解javaSript中函数的参数,当传递的参数是对象时的传递方式. (结合资料的个人 ...