摘要:项目需要添加多张引导页,所以在网上搜集了一些资料并整理好。  

  

  Step1

    添加一个GuideActivity.

    其实这个引导页无非就是一个Activity,里面有一个ViewPager而已。多张图片放进去,装进ViewPager里面。  

    注意:这里Activity中千万不要设置图片资源,不然会报OOM异常。多张图片会导致内存溢出。

    ==>源码如下:

    ①GuideActivity的Kotlin源码  

class GuideActivity : AppCompatActivity(), ViewPager.OnPageChangeListener {

    private var vp: ViewPager? = null
private var imageIdArray: IntArray? = null//图片资源的数组
private var viewList: MutableList<View>? = null//图片资源的集合
private var vg: ViewGroup? = null//放置圆点 //实例化原点View
private var iv_point: ImageView? = null
private var ivPointArray: Array<ImageView?>? = null //最后一页的按钮
private var ib_start: Button? = null override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) supportRequestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.activity_guide)
MainApplication.getInstance().addActivity(this)
StatusBarUtils.setWindowStatusBarColor(this, R.color.headline)
ib_start = findViewById(R.id.guide_ib_start) as Button
ib_start!!.setOnClickListener {
val intent:Intent=Intent(this@GuideActivity,NavigationMainActivity::class.java)
intent.putExtra("openAPP",true)
overridePendingTransition(R.anim.slide_right_in,R.anim.slide_left_out)
startActivity(intent)
finish()
} //加载ViewPager
initViewPager() //加载底部圆点
initPoint()
} /**
* 加载底部圆点
*/
private fun initPoint() {
//这里实例化LinearLayout
vg = findViewById(R.id.guide_ll_point) as ViewGroup
//根据ViewPager的item数量实例化数组
ivPointArray = arrayOfNulls(viewList!!.size)
//循环新建底部圆点ImageView,将生成的ImageView保存到数组中
val size = viewList!!.size
for (i in 0..size - 1) {
iv_point = ImageView(this)
iv_point!!.layoutParams = ViewGroup.LayoutParams(50, 50)
iv_point!!.setPadding(20, 0, 20, 150)//left,top,right,bottom
ivPointArray!![i] = iv_point!!
//第一个页面需要设置为选中状态,这里采用两张不同的图片
if (i == 0) {
iv_point!!.setBackgroundResource(R.mipmap.icon_point_pre)
} else {
iv_point!!.setBackgroundResource(R.mipmap.icon_point)
}
//将数组中的ImageView加入到ViewGroup
vg!!.addView(ivPointArray!![i])
} } /**
* 加载图片ViewPager
*/
private fun initViewPager() {
vp = findViewById(R.id.guide_vp) as ViewPager
//实例化图片资源
imageIdArray = intArrayOf(R.mipmap.intro_school, R.mipmap.intro_discovery_1, R.mipmap.intro_discovery_2
,R.mipmap.intro_discovery_3,R.mipmap.intro_ask_1,R.mipmap.intro_ask_2,R.mipmap.intro_ask_3,R.mipmap.intro_mew_coin)
viewList = ArrayList() //循环创建View并加入到集合中
val len = imageIdArray!!.size
for (i in 0..len - 1) {
//new ImageView并设置全屏和图片资源
val imageView = ImageView(this)
viewList!!.add(imageView)
} //View集合初始化好后,设置Adapter
vp!!.adapter = GuidePageAdapter(viewList)
vp!!.offscreenPageLimit=9
//设置滑动监听
vp!!.setOnPageChangeListener(this)
} override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { } /**
* 滑动后的监听
* @param position
*/
override fun onPageSelected(position: Int) {
//循环设置当前页的标记图
val length = imageIdArray!!.size
for (i in 0..length - 1) {
ivPointArray!![position]!!.setBackgroundResource(R.mipmap.icon_point_pre)
if (position != i) {
ivPointArray!![i]!!.setBackgroundResource(R.mipmap.icon_point)
}
} //判断是否是最后一页,若是则显示按钮
if (position == imageIdArray!!.size - 1) {
ib_start!!.visibility = View.VISIBLE
} else {
ib_start!!.visibility = View.GONE
}
} override fun onPageScrollStateChanged(state: Int) { }
}

   ②activity_guide布局代码: 

<?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.guangdamiao.www.mew_android_debug.navigation.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="150pt"
android:gravity="center_horizontal">
</LinearLayout> <Button
android:layout_width="500pt"
android:layout_height="55pt"
android:id="@+id/guide_ib_start"
android:text="进入大学喵"
android:textSize="30pt"
android:layout_centerHorizontal="true"
android:layout_above="@+id/guide_ll_point"
android:background="@drawable/button_shape_apply"
android:visibility="gone"/> </RelativeLayout>

  

  Step2

  第二步就是写这个GuidePageAdapter了。

    注意在instanticateItem(ViewGroup container,int position)中设置背景图片,提高加载速度,解决OOM问题。

    源码如下:

  

public class GuidePageAdapter extends PagerAdapter {
private List<View> viewList;
private int[] mResIds=new int[]{
R.mipmap.intro_school,
R.mipmap.intro_discovery_1,
R.mipmap.intro_discovery_2,
R.mipmap.intro_discovery_3,
R.mipmap.intro_ask_1,
R.mipmap.intro_ask_2,
R.mipmap.intro_ask_3,
R.mipmap.intro_mew_coin,
}; 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) {
//在此设置背景图片,提高加载速度,解决OOM问题
View view=viewList.get(position);
int count=getCount();
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
view.setBackgroundResource(mResIds[position%count]);
view.setLayoutParams(params);
container.addView(viewList.get(position));
return viewList.get(position);
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
}

  

  Step3

  第三步就是在启动页中设置跳转引导页了。

  引导页一般是第一次安装APP后才会出现,这里可以写一个sharePreferences文件记录是不是第一次安装。

  最后利用intent跳转到引导页就可以了。

Android如何添加多张引导页的更多相关文章

  1. android使用ViewPager实现欢迎引导页

    android使用ViewPager实现欢迎引导页 大多数APP第一次启动的时候,都会有一个引导界面,左右滑动,到最后一张,用户点击才再次进入主界面.当第二次启动的时候,则直接进入主界面. 这种效果一 ...

  2. android仿网易云音乐引导页、仿书旗小说Flutter版、ViewPager切换、爆炸菜单、风扇叶片效果等源码

    Android精选源码 复现网易云音乐引导页效果 高仿书旗小说 Flutter版,支持iOS.Android Android Srt和Ass字幕解析器 Material Design ViewPage ...

  3. android脚步---APP引导页添加

    package com.leadcore.uudatoutie; import java.util.ArrayList; import com.leadcore.uudatoutie.R; impor ...

  4. iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ①)

    好长时间没更新博客, 是时候来一波干货分享了;APP引导页话不多说每一个APP都会用到,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了吧,当然这里讲的不是 ...

  5. GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD)

    每一个APP都会用到APP引导页,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了,当然这里讲的不是APP引导页的美化而是APP引导页的高度集成,一行代码搞 ...

  6. [iOS]简单的APP引导页的实现 (Swift)

    在第一次打开APP或者APP更新后通常用引导页来展示产品特性 我们用NSUserDefaults类来判断程序是不是第一次启动或是否更新,在AppDelegate.swift中加入以下代码: func ...

  7. Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页

    前言: 开篇比较简单:Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置 第二篇教程之前写了一半,感觉不太好写,而且内容单纯介绍API,要说的很多,又枯燥乏味. ...

  8. Android项目实战(三):实现第一次进入软件的引导页

    最近做的APP接近尾声了,就是些优化工作了, 我们都知道现在的APP都会有引导页,就是安装之后第一次打开才显示的引导页面(介绍这个软件的几张可以切换的图) 自己做了一下,结合之前学过的 慕课网_Vie ...

  9. Android 高级UI设计笔记22:Android 指示引导页(带圆点)

    1. 引导页: 我们在安装某个软件首次运行时,大部分都会有一个引导页的提示,介绍软件新功能的加入或者使用说明等,支持滑动且下面会有几个圆点,显示共有多少页和当前图片的位置,类似如下效果: 2. 引导页 ...

随机推荐

  1. ubuntu配置硬盘开机自动挂载

    1.创建/media/fly文件夹 sudo mkdir /home/fly    #根据个人喜好命名 2.获取要自动挂载的分区的UUID和分区类型TYPE sudo blkid 出现如下结果:   ...

  2. AJPFX关于面向对象之封装,继承,多态 (上)

    Java是一种面向对象的语言,这是大家都知道的,他与那些像c语言等面向过程语言不同的是它本身所具有的面向对象的特性--封装,继承,多态,这也就是传说中的面向对象三大特性 一:从类和对象开始说起: Oo ...

  3. CSS单词换行and断词,你真的完全了解吗

    背景 某天老板在群里反馈,英文单词为什么被截断了? 很显然,这是我们前端的锅,自行背锅.这个问题太简单了,css里加两行属性,分分钟搞定. 开心的提交代码,刷新页面.我擦,怎么还是没有断词?不可能啊! ...

  4. linux下配置Nginx,支持thinkphp

    前言引入 一个刚入行的朋友,刚换工作,入职了一个新公司.新公司一个php开发,就是他.俨然老板把他当成公司扛把子了,把服务器都给了他,让他部署整个php的开发环境.那个朋友是wamp爱好者.然后面对l ...

  5. Codeforces 763A. Timofey and a tree

    A. Timofey and a tree 题意:给一棵树,要求判断是否存在一个点,删除这个点后,所有连通块内颜色一样.$N,C \le 10^5$ 想法:这个叫换根吧.先求出一个点合法即其儿子的子树 ...

  6. IE的Trident引擎下实现C++和Javascript相互调用

    我们知道实现C++和Javascript通讯有下表5种接口: 引擎 编写语言 API接口 C.C++与JavaScript交互(变量.函数.类) vc2005编译静态库的大小 示例EXE的大小 执行. ...

  7. 2018.10.05 TOPOI提高组模拟赛 解题报告

    得分: \(100+5+100=205\)(真的是出乎意料) \(T1\):抵制克苏恩(点此看题面) 原题: [BZOJ4832][Lydsy1704月赛] 抵制克苏恩 应该还是一个比较简单的\(DP ...

  8. 删除临时文件的bat文件

    @echo offecho 正在清除系统垃圾文件,请稍等......del /f /s /q %systemdrive%\*.tmpdel /f /s /q %systemdrive%\*._mpde ...

  9. SSM框架之动态代理Mapper快速搭建

    1.   新建Maven项目 ssmnew 2.    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  10. 解决Jquery中使用each循环时,循环外的js依旧会执行

    今天在改项目bug时,发现一个问题,我获取一个div中所有的input,并取值时,判断某一条件,但是循环外的js依然可以执行. $(".tab-reg-next input").e ...