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包,可参考本站相关教程http://www.jb51.net/softjc/552873.html

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

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

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

(0)

相关推荐

  • Android UI设计与开发之ViewPager仿微信引导界面以及动画效果

    基于前两篇比较简单的实例做铺垫之后,这一篇我们来实现一个稍微复杂一点的引导界面的效果,当然也只是稍微复杂了一点,对于会的人来说当然还是so easy!正所谓会者不难,难者不会,大概说的就是这个意思了吧.好的,话不多说,回归正题. 这篇要实现的是一个仿微信的动画效果,虽然这种效果的实现在网上到处都有,但是我还是想站在中低端开发者的角度去告诉大家是如何实现的,当然实现的方式有很多,我也只是列出了我认为实现起来比较方便的一种方法,希望大家能够受用. 一.实现的效果图 有图才有真相,上图先: 点击按钮后

  • Android利用ViewPager实现用户引导界面效果的方法

    本文实例讲述了Android利用ViewPager实现用户引导界面效果.分享给大家供大家参考,具体如下: 我相信有很多朋友在装完软件首次打开时,有很多软件都有一个软件功能介绍, 例如刚装完微信打开它,有很多介绍微信功能的图片,并且在屏幕下方有很多小圆点提示你当前图片的位置. 今天我就来实现这么个功能 所实现的功能: 1.可以左右滑动功能图片. 2.图片的索引 看出当前图片所在的位置. 3.可循环滑动. 4.图片的索引带有动画效果. 本次学习主要是利用ViewPager实现用户引导界面 在这里,我

  • Android UI设计与开发之使用ViewPager实现欢迎引导页面

    本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载地址,几乎源码的每一行都有注释,写的通俗易懂,非常清晰,如有不懂的可以留言,本博主一定尽心尽力,为大家答题解惑,希望大家多多支持,好的,话不多说,让我们回归到今天的正题. 一.实现的效果图 也许是养成了这样一个习惯,每次看别人的代码前,必须要先看实现的效果图达到了一个什么样的效果,是不是跟自己想要实

  • Android利用ViewPager实现滑动广告板实例源码

    •android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其中之一,利用它我们可以做很多事情,从最简单的导航,到页面切换菜单等等. •ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样. •本Demo向大家演示ViewPager的使用,并在用户未滑动View时,每隔5s钟自动切换到下一个View(循环切换),而当用户有Touch到Vi

  • Android开发实战之漂亮的ViewPager引导页

    目前很多软件安装时都会出现引导页面,用户体验很好. 下面就来DIY下: 因为视频上传很麻烦,所以截图了. 首先看看效果图: 点击小点可自由切换,滑动也可以自由切换,最后一个导航页添加了点击跳转. 开始实现引导页: 一.采集需要的图片放入drawable文件里 二.初始化每个导航页的视图 import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.suppo

  • Android控件ViewPager实现带有动画的引导页

    ViewPager实现带有动画的引导页,供大家参考,具体内容如下 好了,又到我们学习基础控件的时候了,其实引导页很简单,就是五张图片而已 一.ViewPager实现传统的引导页 传统的ViewPager实现引导页和ListView是一样道理的,只是把ListView的Item换成图片,把BaseAdapter换成PagerAdapter,我们先来看下传统引导页的效果图 步骤一:编写xml文件 既然用到的是ViewPager,那么xml文件就必须要有ViewPager,细心的你,可能会发现最后一页

  • android教程viewpager自动循环和手动循环

    复制代码 代码如下: package com.imoyo.expert; import java.util.ArrayList; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;imp

  • Android启动引导页使用ViewPager实现

    我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等. 一般都支持滑动并且下面有几个点,显示共有多少页和当前图片的位置,在IOS上这个实现起来比较简单,但在安卓上如何实现呢. 今天就和大家一起来学习用官方v4支持包下的ViewPager来实现这个效果. 先上图: 下面是我的实现,一个xml布局,一个GuideActivity和一个GuidePageAdapter.  先上XML. <?xml version="1.0" enco

  • Android UI设计与开发之ViewPager介绍和简单实现引导界面

    做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受--UI设计开始写起吧,循序渐进,娓娓道来.博主在这里和大家一起学习,希望能多多支持,话不多说,下面就开始讲解UI设计的第一篇. 在讲解如何实现引导界面的效果之前,我想先详细介绍一下ViewPager类的使用和说明,因为这是开发引导界面最重要的类,没有之一. 一.ViewPager实现的效果图 二.

  • Android ViewPager相册横向移动的实现方法

    当我们第一次下载QQ并且打开的时候,会有一个新手引导,引导是几张图片,再加上一些文字说明,向右滑动,直到结束,今天一大早起来研究了一下关于此种效果的实现之ViewPager控件. 下面这个例子将用ViewPager实现横向移动相册,ViewPager有一个对应的PagerAdapter,用于绑定数据:我们需要继承此类并实现自己的功能. 1.首先定义一个显示项所需要使用的数据对象ImageItem 复制代码 代码如下: public class ImageItem { private int id

随机推荐