ViewPager+PagerAdapter实现带指示器的引导页

一个简单的引导页,由ViewPager和PagerAdapter组成,供大家参考,具体内容如下

package com.xspacing.viewpager;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
/**
 *
 * @ClassName MainActivity.java
 * @Description TODO 引导页
 * @author Smile
 * @version v1.0
 * @date 2016年9月26日
 */
public class MainActivity extends Activity {

  protected static final String TAG = "MainActivity";
  ViewPager mViewPager;
  List<ImageView> list;
  private LinearLayout mLinearLayout;

  // 两个小灰点的距离
  private int poitWidth;
  private ImageView mViewPress;
  private ImageView mViewNotPress;
  private Button btnStart;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initViews();
    initDatas();
  }

  private void initViews() {
    mViewPager = (ViewPager) findViewById(R.id.main_view_pager);
    mLinearLayout = (LinearLayout) findViewById(R.id.main_point);
    mViewPress = (ImageView) findViewById(R.id.main_red_point_press);
    btnStart = (Button) findViewById(R.id.main_btn);
  }

  private void initDatas() {
    list = new ArrayList<ImageView>();
    final int imageId[] = { R.drawable.a, R.drawable.b, R.drawable.c };
    for (int i = 0; i < imageId.length; i++) {
      ImageView imageView = new ImageView(this);
      imageView.setBackgroundResource(imageId[i]);
      list.add(imageView);
      mViewNotPress = new ImageView(this);
      mViewNotPress.setImageResource(R.drawable.shape_grey_point_not_press);
      LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
          LinearLayout.LayoutParams.WRAP_CONTENT);
      if (i != 0) {
        layoutParams.leftMargin = 20;
      }
      mLinearLayout.addView(mViewNotPress, layoutParams);

    }

    // 由于在执行onCreate()的时候,界面还没有被绘制完成,所有拿不到poitWidth,
    // 要拿到视图树,监听视图的绘制完成,才能拿到poitWidth
    mViewPress.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

      @Override
      public void onGlobalLayout() {
        poitWidth = mLinearLayout.getChildAt(1).getLeft() - mLinearLayout.getChildAt(0).getLeft();
        Log.i(TAG, poitWidth + "");
      }
    });
    mViewPager.setAdapter(new ViewPgerAdapter(this, list));

    mViewPager.addOnPageChangeListener(new OnPageChangeListener() {

      // 当前选中的是第几个界面
      @Override
      public void onPageSelected(int position) {
        if (position==imageId.length-1) {
          btnStart.setVisibility(View.VISIBLE);
        }
        else {
          btnStart.setVisibility(View.GONE);
        }
      }

      // 界面滑动的时候,会不断地回调这个方法
      // 第二个参数是当前页面滑过的百分比(0.0到1.0)
      @Override
      public void onPageScrolled(int position, float offset, int arg2) {
        Log.i(TAG, "arg1:" + offset);
        // 小红点当前滑动的距离
        int width = (int) (poitWidth * offset + position * poitWidth);
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mViewPress.getLayoutParams();
        layoutParams.leftMargin = width;
        mViewPress.setLayoutParams(layoutParams);
      }

      @Override
      public void onPageScrollStateChanged(int arg0) {

      }
    });
  }

}
package com.xspacing.viewpager;

import java.util.List;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class ViewPgerAdapter extends PagerAdapter {

  Context mContext;
  List<ImageView> list;

  public ViewPgerAdapter(Context context, List<ImageView> list) {
    this.mContext = context;
    this.list = list;
  }

  // 页数
  @Override
  public int getCount() {
    return list.size();
  }

  // 复用页卡
  @Override
  public boolean isViewFromObject(View view, Object obj) {
    return view == obj;
  }

  // 销毁页卡
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView(list.get(position));
  }

  // 生成页卡
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    View view = list.get(position);
    container.addView(view);
    return view;
  }

}

shape文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="oval" >

  <size
    android:height="10dp"
    android:width="10dp" />
  <solid android:color="#C3C3C3"/>

</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="oval" >

  <size
    android:height="10dp"
    android:width="10dp" />
  <solid android:color="#44FF0000"/>

</shape>
<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"
  tools:context="com.xspacing.viewpager.MainActivity" >

  <android.support.v4.view.ViewPager
    android:id="@+id/main_view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
  </android.support.v4.view.ViewPager>

  <RelativeLayout
    android:id="@+id/main_relative"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="50dp" >

    <LinearLayout
      android:id="@+id/main_point"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="horizontal" >
    </LinearLayout>

    <ImageView
      android:id="@+id/main_red_point_press"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/shape_red_point_press" />
  </RelativeLayout>

  <Button
    android:id="@+id/main_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="30dp"
    android:visibility="gone"
    android:layout_above="@id/main_relative"
    android:layout_centerHorizontal="true"
    android:text="开始体验" />

</RelativeLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • ViewPager打造轮播图Banner/引导页Guide

    前言 去年7月时,在Github发布了一个开源的Banner库,虽然Star不多,但还是有少部分人使用. Banner效果: Github链接地址:https://github.com/Allure0/LMBanners 昨天,有使用此库的同学提出需求,想在引导页的时候用这个库并且最后一页有进入按钮如何实现,为满足他的需求,也方便更多开发者是快速实现.进行了简单的扩展支持Guide模式的使用. Guide效果图: OK,效果如图所以,咱们此库满足了既可在Banner上使用也可以快速在第一次安装应

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

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

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

    本文实例讲述了Android开发实现的ViewPager引导页功能(动态加载指示器).分享给大家供大家参考,具体如下: 先看效果图咯~ 现在几乎每个App都会有引导页,是不是感觉很炫很厉害,所以就想做出来一个学习一下~让自己的App看起来更加的美观~ 现在来分析一下: 这个引导页可以分为俩部分~ 1.小红点--来提醒这是第几页了~ 2."开始体验"这个Button--可以进入主界面,但是要控制这个Button只能在最后一页出现 布局的话使用相对布局~ 那现在来看看布局吧: activi

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

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

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

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

  • ViewPager实现漂亮的引导页

    废话就不多说了,直接上效果图和代码 fry.Activity01 package fry; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import com.example.viewPager.R; import android.app.Activity; impor

  • ViewPager+PagerAdapter实现带指示器的引导页

    一个简单的引导页,由ViewPager和PagerAdapter组成,供大家参考,具体内容如下 package com.xspacing.viewpager; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support

  • Android实现渐变启动页和带有指示器的引导页

    引导页是项目中很常见的东西了,在用户下载app首次打开后,会进入引导界面,通常都是三四张图片说明,简单介绍下app的功能和使用方法之类,最后一张有着"进入应用"的按钮,点击即可进入主页,之后打开app则不会再次进入启动页,话不多说,以下做个归纳. 效果图: 实现步骤: 1.首先我们做个有渐变动画的启动页面SplashActivity 在onCreate里设置核心方法setAlphaAnimation() public void setAlphaAnimation(){ //生成Alph

  • 自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果

    在工作中又很多需求都不是android系统自带的控件可以达到效果的,内置的TabHost就是,只能达到简单的效果 ,所以这个时候就要自定义控件来达到效果:这个效果就是: 使用自定义RadioButton和ViewPager实现TabHost带滑动的页卡效果. 这篇文章技术含量一般,大家别见笑.源码我以测试,在底部可下载.好了先上效果图: 以下是实现步骤:        1.准备自定义RadioButton控件的样式图片等,就是准备配置文件: (1). 在项目的values文件夹里面创建 attr

  • Android使用ViewPager完成app引导页

    本文实例为大家分享了Android使用ViewPager完成app引导页的具体代码,供大家参考,具体内容如下 public class MainActivity extends AppCompatActivity { // int[] resourceId = { // R.layout.first, // R.layout.second, // R.layout.third // }; List<View> mListView; ViewPager viewPager; ViewGroup

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

    本文实例为大家分享了Android实现启动引导页效果的具体代码,供大家参考,具体内容如下 ViewPagerTwoActivity.java package cn.edu.zufe.app001; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.PagerAdapter; import androidx.vie

随机推荐