欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发实现的ViewPager引导页功能(动态加载指示器)详解

程序员文章站 2022-04-11 18:38:20
本文实例讲述了android开发实现的viewpager引导页功能(动态加载指示器)。分享给大家供大家参考,具体如下: 先看效果图咯~ 现在几乎每个app都会有引导...

本文实例讲述了android开发实现的viewpager引导页功能(动态加载指示器)。分享给大家供大家参考,具体如下:

先看效果图咯~

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包,可参考本站相关教程

附:完整实例代码点击此处本站下载

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android布局layout技巧总结》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android操作json格式数据技巧总结》、《android资源操作技巧汇总》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。