当前位置: 移动技术网 > 移动技术>移动开发>Android > Android开发实现的ViewPager引导页功能(动态加载指示器)详解

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网