Android开发实战之ViewPager实现向导界面
当我们更新应用,或者第一次进入应用时都会有一个向导界面,介绍这个app的内容和使用方式。
如果你细心你会发现其实这就是个viewpager,本篇博文将介绍应用的向导界面是如何制作的。希
望本篇博文对你的学习和生活有所帮助。
好了不多说,放上效果图:

需要注意的是,下方的圆点跟随着viewpager滑动,当滑动到最后一张的时候,开始体验按钮出现了。
viewpager的基础我就不多说了,如果你不是很明白,可以查看我的上一篇博客:http://www.cnblogs.com/lovelyYakir/p/5797153.html。
我就重点介绍一下下方圆点更随着viewpager滑动是如何实现的。
**第一次进入**
关于是否是第一次进入,实现方式比较简单,用过使用SharedPreferences保存使用状态,将他封装到工具类中便于使用:
public class SplashUtils {
public static void setBoolean(Context context,String key, Boolean value) {
SharedPreferences sharedPreferences=context.getSharedPreferences(Constants.CONFIGFILE,Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putBoolean(key,value);
editor.commit();
}
public static Boolean getBoolean(Context context,String key,Boolean dfValue) {
SharedPreferences sharedPreferences=context.getSharedPreferences(Constants.CONFIGFILE,Context.MODE_PRIVATE);
return sharedPreferences.getBoolean(key,dfValue);
}
}
需要注意的是,getBoolean方法最后一个参数无论是true,是false,都不会影响到我们的取值,所以可以写,也可以不写。
**小圆点随ViewPager滑动**
实现思路:当viewpager滑动的时候,红点随着滑动量而移动。需要监听viewpager的滑动。
关于红点,如果你有UI,可以叫UI帮你画,如果没有UI,那就只能自己画了。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!--半径-->
<corners android:radius="10dip"></corners>
<!--颜色-->
<solid android:color="#ff0000"></solid> </shape>
下面是XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vp_gide"> </android.support.v4.view.ViewPager>
<RelativeLayout
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="30dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/ll_guide_point">
</LinearLayout>
<View
android:layout_width="20px"
android:layout_height="20px"
android:id="@+id/guide_point"
android:background="@drawable/red_point"/>
</RelativeLayout>
<Button
android:id="@+id/btn_guide"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始体验"
android:textColor="@color/btn_text_color"
android:background="@drawable/btn_select"
android:visibility="gone"/>
</RelativeLayout>
好了布局算是完成了,开始处理逻辑模块,首先我们需要知道这个红色圆点的宽和高,但是我们知道,绘制完成一般是在oncreated()之后完成的。那么,我们就需要对这个
view进行监听,当它绘制完成之后,拿到具体信息。
//监听界面绘制完成
viewPoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override
public void onGlobalLayout() {
//取消注册界面而产生的回调接口
viewPoint.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//计算点于点之间的距离
pointDistance = linearLayoutGuide.getChildAt(1).getLeft()-linearLayoutGuide.getChildAt(0).getLeft();
Log.e("this", String.valueOf(pointDistance));
}
});
灰色的点在LinearLayout中绘制:
//获取点
View pointView=new View(getApplicationContext());
pointView.setBackgroundResource(R.drawable.gray_point);
//设置灰色点的显示大小
float dip=20;
float distance=20;
LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(
Density.dipTopx(getApplicationContext(),dip),
Density.dipTopx(getApplicationContext(),dip));//单位是px,不是dp,为了做适配需要装换
//设置点与点的距离,第一个点除外
if (i!=0) {
params.leftMargin = Density.dipTopx(getApplicationContext(),distance);//px
}
pointView.setLayoutParams(params); linearLayoutGuide.addView(pointView);
滑动事件监听滑动距离,点更随滑动。
viewPagerGuide.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
/**
*页面滑动调用,拿到滑动距离设置视图的滑动状态
* @param position 当前页面位置
* @param positionOffset 移动的比例值
* @param positionOffsetPixels 便宜的像素
*/
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//计算红点的左边距
float leftMargrain=pointDistance*(position+positionOffset);
//设置红点的左边距
RelativeLayout.LayoutParams params= (RelativeLayout.LayoutParams) viewPoint.getLayoutParams();
//对folat类型进行四舍五入,
params.leftMargin=Math.round(leftMargrain);
//设置位置
viewPoint.setLayoutParams(params);
}
@Override
public void onPageSelected(int position) {
if (position==imagList.size()-1) {
buttonGuide.setVisibility(View.VISIBLE);
}
else {
buttonGuide.setVisibility(View.GONE);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
好了,一个向导界面就完成了。代码我注释的都很详细,这一篇博文还是主要对viewpager滑动事件的处理,希望本篇博文对你的学习和生活有所帮助,如果有写的不对的地方
希望你能在下方留言评论,互相交流,互相学习。
Android开发实战之ViewPager实现向导界面的更多相关文章
- Android开发实战之ViewPager的轮播
在安卓开发的许多控件中,如果你没有使用过ViewPager,就不能算是一个安卓开发工程师,在本篇博文中,我会总结ViewPager的使用方法, 以及一些开发中的拓展.希望本篇博文对你的学习和工作有所帮 ...
- Xamarin Android开发实战(上册)大学霸内部资料
Xamarin Android开发实战(上册)大学霸内部资料 试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamar ...
- Android开发实战(申明:来源于网络)
Android开发实战(申明:来源于网络) 地址:http://so.csdn.net/so/search/s.do?q=Android%E5%BC%80%E5%8F%91%E5%AE%9E%E6%8 ...
- 阅读《名师讲坛--Android开发实战经典》
一,专心,快速阅读一本书,直到深入理解,把书读厚,再读薄,你定会有收获. 二,20171214开始阅读<名师讲坛--Android开发实战经典>,但愿自己有所收获.从今天开始养成刻录学习写 ...
- 我的 Android 开发实战经验总结
我的 Android 开发实战经验总结 字数4440 阅读5137 评论43 喜欢250 曾经一直想写一篇总结 Android 开发经验的文章,预计当时的我还达不到某种水平,所以思路跟不上,下笔又捉襟 ...
- Android开发实战(二十一):浅谈android:clipChildren属性
实现功能: 1.APP主界面底部模块栏 2.ViewPager一屏多个界面显示 3......... 首先需要了解一下这个属性的意思 ,即 是否允许子View超出父View的返回,有两个值true . ...
- Android开发之利用ViewPager实现页面的切换(仿微信、QQ)
这里利用ViewPager实现页面的滑动,下面直接上代码: 1.首先写一个Activity,然后将要滑动的Fragment镶嵌到写好的Activity中. Activity的布局文件:activity ...
- Android开发之利用ViewPager实现在Activity或Fragment中引入别的布局文件实现滑动并进行页面跳转
有些时候经常可以看到其他APP中有一排的图标,可以在一个界面中滑来滑去,并且图标可以进行点击事件进行页面的跳转.这里对这种方法的实现做出总结. 首先看一下图片: 下面这两种图片是在一个Fragment ...
- Android开发经验01:31个Android开发实战经验
1. 在Android library中不能使用switch-case语句访问资源ID:在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案 2. 不能 ...
随机推荐
- coredns 编译模式添加插件
备注: coredns 默认已经安装了一些插件,比如大家用的多的kubernetes etcd ... 但是我们可以自己编译插件,构建我们自己的 coredns 版本,方便集成使用 1. 项目结 ...
- tomcat深入学习
总体结构:https://www.jianshu.com/p/d74eef07487f servlet相关:https://www.ibm.com/developerworks/cn/java/j-l ...
- centos 限制只能访问某个目录的php文件
vi /etc/php.ini #编辑 open_basedir = .:/tmp/ #在380行 设置表示允许访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录,可以防止php木马跨站,如果 ...
- 3.JMeter添加集合点
1.JMeter的集合点是通过添加定时器来完成的,在做性能测试时,真正的并发是不可能的,为了更真实的模拟并发场景,因此在需要压测的地方设置集合点,即可一起操作发送请求. 2.JMeter添加定时器,右 ...
- python 面向对象(三大特性)
python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- java代码-----indexOf()方法--从字符串的某个字符的第一次出现的位子开始
总结:方法是indedOf()方法.this is my sister //indexOf()方法是indexOf('m')==7 .那么就是字符m第一次出现的位置是顺数第7个,就会正常显示‘t ...
- 【学步者日记】UnityEditor扩展菜单以及ScriptableObject
完整版链接:http://note.youdao.com/noteshare?id=c54f35ca19371886e6a94302387bb6cd 下面是预览的部分,带图的版本请看上面链接. ...
- 业务SQL优化
1,个人开户报表统计 优化前语句,执行时间80多秒 SELECT a.DA AS f_da, a.account_name AS f_account_name, a.sex AS f_sex, a.n ...
- 使用wifi网卡笔记2----概念及工具iw(STA模式)
1.认证和加密的概念 (1)概念 (2)阶段划分 初级版本:认证不需要密码, 传输不需要加密 认证不需要密码, 传输需要加密(用WEP算法) 认证需要密码(用WEP算法), 传输需要加密(用WEP算法 ...
- Android:自定义Sqlite数据库路径
默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目 ...