Android开发实现的ViewPager引导页功能(动态加载指示器)详解
作者:飘走的我 发布时间:2021-10-16 17:40:35
本文实例讲述了Android开发实现的ViewPager引导页功能(动态加载指示器)。分享给大家供大家参考,具体如下:
先看效果图咯~
现在几乎每个App都会有引导页,是不是感觉很炫很厉害,所以就想做出来一个学习一下~让自己的App看起来更加的美观~
现在来分析一下:
这个引导页可以分为俩部分~
1.小红点--来提醒这是第几页了~
2.“开始体验”这个Button--可以进入主界面,但是要控制这个Button只能在最后一页出现
布局的话使用相对布局~
那现在来看看布局吧:
activity_main:
<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"
>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<RelativeLayout
android:id="@+id/rl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp">
<LinearLayout
android:id="@+id/linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
</LinearLayout>
</RelativeLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
android:visibility="invisible"
android:text="开始体验"/>
</RelativeLayout>
开始体验这个Button设置了不可见来控制在最后一页出现~
小圆点还没开始写出来,只是写了个RelativeLayout嵌套了一个LinearLayout
然后在分析这个页面的滑动~
先把要滑动的图片放进来:
private ViewPager viewPager;
private int[]images={R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3};
private List<ImageView>imageViews;//用来存放几个imageview的实例
实例化并且加载适配器:
viewPager.setAdapter(new MyAdapter());
imageViews=new ArrayList<ImageView>();
for(int i=0;i<images.length;i++){
ImageView imageView=new ImageView(this);
imageView.setImageResource(images[i]);
imageViews.add(imageView);
class MyAdapter extends PagerAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return images.length;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(imageViews.get(position));
return imageViews.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView((View)object);
}
}
其实写到这里就可以完成图片的滑动,但是还没有小红点的出现~这时候就要写小红点了~小红点默认是在第一页就出现了的~
在drawable文件下写了俩个xml文件,red_circle--代表红点,gray_circle--代表灰点~
red_circle:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="10dp"
android:height="10dp"/>
<!-- 填充颜色 -->
<solid
android:color="#ff0000"/>
</shape>
gray_circle:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="10dp"
android:height="10dp"/>
<!-- 填充颜色 -->
<solid
android:color="#ECECEC"/>
</shape>
现在代表颜色的文件写好了,那怎么把它们加进去呢~~
先默认都是灰点,然后在把红点覆盖上去,看代码怎么写:
ImageView gray_Iv=new ImageView(this);
gray_Iv.setImageResource(R.drawable.gray_circle);
//使用LayoutParams改变控件的位置
LinearLayout.LayoutParams layoutParams=
new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
if(i>0){
layoutParams.leftMargin=20;
}
gray_Iv.setLayoutParams(layoutParams);
li.addView(gray_Iv);
把灰点都加到LinearLayout里面
而红点:
red_Iv=new ImageView(this);
red_Iv.setImageResource(R.drawable.red_circle);
rl.addView(red_Iv);
把红点加到RelativeLayout里面
还要写个示图树~让红点来滑动:
//示图树
red_Iv.getViewTreeObserver().
addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//该方法就是在界面全面绘制结束之后回调
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
//求距离
left=li.getChildAt(1).getLeft()-li.getChildAt(0).getLeft();
System.out.println("left为"+left);
red_Iv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
viewPager的滑动 * 还要监听图片什么时候滑动,以至于让红点滑动的跟好看(就比如第一个点到第二个点的途中也会有红点)
//滑动的时候
@Override
public void onPageScrolled(int position, float posionOffset, int arg2) {
// TODO Auto-generated method stub
System.out.println(posionOffset);//滑动的百分比
RelativeLayout.LayoutParams layoutParams=
(RelativeLayout.LayoutParams)red_Iv.getLayoutParams();
layoutParams.leftMargin=(int)(left*posionOffset+position*left);
red_Iv.setLayoutParams(layoutParams);
}
还要分析下让“开始体验”这个Button出现在最后一页,那就只能在viewPager的滑动监听方法里面写可见与不可见了~
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(position==images.length-1){
btn.setVisibility(View.VISIBLE);
}else{
btn.setVisibility(View.GONE);
}
}
完整MainActicity代码:
public class MainActivity extends Activity {
private ViewPager viewPager;
private int[]images={R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3};
private List<ImageView>imageViews;//用来存放几个imageview的实例
private LinearLayout li;
private RelativeLayout rl;
private ImageView red_Iv;
private int left;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
viewPager=(ViewPager) findViewById(R.id.viewPager);
li=(LinearLayout) findViewById(R.id.linear);
rl=(RelativeLayout) findViewById(R.id.rl);
btn=(Button) findViewById(R.id.btn);
viewPager.setAdapter(new MyAdapter());
imageViews=new ArrayList<ImageView>();
for(int i=0;i<images.length;i++){
ImageView imageView=new ImageView(this);
imageView.setImageResource(images[i]);
imageViews.add(imageView);
ImageView gray_Iv=new ImageView(this);
gray_Iv.setImageResource(R.drawable.gray_circle);
//使用LayoutParams改变控件的位置
LinearLayout.LayoutParams layoutParams=
new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
if(i>0){
layoutParams.leftMargin=20;
}
gray_Iv.setLayoutParams(layoutParams);
li.addView(gray_Iv);
}
red_Iv=new ImageView(this);
red_Iv.setImageResource(R.drawable.red_circle);
rl.addView(red_Iv);
//示图树
red_Iv.getViewTreeObserver().
addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//该方法就是在界面全面绘制结束之后回调
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
//求距离
left=li.getChildAt(1).getLeft()-li.getChildAt(0).getLeft();
System.out.println("left为"+left);
red_Iv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
if(position==images.length-1){
btn.setVisibility(View.VISIBLE);
}else{
btn.setVisibility(View.GONE);
}
}
//滑动的时候
@Override
public void onPageScrolled(int position, float posionOffset, int arg2) {
// TODO Auto-generated method stub
System.out.println(posionOffset);//滑动的百分比
RelativeLayout.LayoutParams layoutParams=
(RelativeLayout.LayoutParams)red_Iv.getLayoutParams();
layoutParams.leftMargin=(int)(left*posionOffset+position*left);
red_Iv.setLayoutParams(layoutParams);
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
class MyAdapter extends PagerAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return images.length;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(imageViews.get(position));
return imageViews.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView((View)object);
}
}
}
PS:这里使用到了android-support-v4.jar文件,需要在项目中导入jar包,可参考本站相关教程https://www.jb51.net/softjc/552873.html
附:完整实例代码点击此处本站下载。
希望本文所述对大家Android程序设计有所帮助。
来源:http://blog.csdn.net/qq_33642117/article/details/51867421


猜你喜欢
- 最近因为工作的原因用到了西门子PLC,在使用过程中一直在思考上位机和PLC的通讯问题,后来上网查了一下,找到了一个专门针对S7开发的一个.n
- 本文实例为大家分享了java实现饮料自助售货机的具体代码,供大家参考,具体内容如下①用户类import java.util.Scanner;
- 如下所示:String beginDate="1328007600000";SimpleDateFormat sdf=n
- 前言这两天面试了一个物联网公司高级研发,面试题是下面这样子公司领导,部门主管,小组组长,组成员4级,假如有个 疫情预警,先通知组人员(对个人
- 前言自从 2017 年 C# 7.0 版本开始引入声明模式和常数模式匹配开始,到 2022 年的 C# 11 为止,最后一个板块列表模式和切
- 总结并复现了一下Unsafe在安全领域的一些应用0 前言unsafe里面有很多好用的方法,比如allocateInstance可以直接创建实
- 一、抽象类是什么?在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的
- 引言在实际应用场景中,我们封装一个学生的类,这个类用于封装学生的日常行为,如:上学、吃饭、上课等。然而,在疫情期间,学生上学时入校、吃饭时进
- 前言 最近利用空闲时间学习了自定义View的一些知识,为了巩固,写了一个小东西,顺便分享出来,下面话不多说了,来一起看看详细的介绍吧。简介
- TestCar.javapublic class TestCar { public static voi
- 本文实例为大家分享了Android实现底部滚轮式选择弹跳框的具体代码,供大家参考,具体内容如下先看效果:调用方法:SlideDialog s
- 话不多说直接上代码,简单明了import java.io.File;import java.io.FileInputStream;impor
- 一、项目目录即一个空项目里,有两个springboot的Module。当需要修改kuangshen-es-api这个Module的jdk版本
- 亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践。你是否在用户输入验证中使用异常处理机制?如果是,那么你就是那个把你的项目执行速度降
- 快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源
- 主要功能共有三个角色:管理员、教师、学生。管理员功能有:学生管理、教师管理、评教管理、指标管理、课程管理等。教师功能有:学生管理、指标管理、
- 本文实例为大家分享了C#基于Socket实现多人聊天功能的具体代码,供大家参考,具体内容如下服务器服务器负责接受所有客户端发来的消息,和将接
- 加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办法,这种方式虽然粗暴,但是灵活,因为可
- 一、委托1、什么是委托委托是面向对象的、类型安全的,是引用类型。使用delegate关键字进行定义。委托的本质就是一个类,继承自System
- 单例模式单例模式顾名思义就是单一的实例,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建,并且提供一种可以访问这个对象