ViewPager实现带引导小圆点与自动跳转的引导界面

实现引导小圆点的方法其实很简单,可直接在布局上放置与引导页面等量的ImageView,然后在切换页面的时候更改图片资源就好了。这里顺便提一下,有些APP是干脆在制作引导页面图片的时候加上引导小圆点,这种方式显然最简单不过了,但是既然是附在图片上的,在切换的时候也是随着图片滑动的,显然看起来效果并不是很好,甚至在我们需要加入小圆点的切换动画时,那就更不能这么去做了。

首先我们先来看看实现效果

这里我们的小圆点图片资源是采用shape绘制的,这里我弄的很随便,所以很粗糙,如果觉得不是很美观那就自行修改吧。如果你是直接使用png资源的话,可直接跳过这一步。

shape_ring_black_normal.xml(黑色小圆环)

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

  <solid android:color="#FFFFFF" /> 

  <size android:width="24dp"
    android:height="24dp"/> 

  <stroke android:color="#000000"
    android:width="1dp"/> 

</shape>

shape_circle_blue_press.xml(蓝色小圆点)

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

  <solid android:color="#0000F1"/> 

  <size android:width="24dp"
    android:height="24dp"/> 

</shape>

再来个选择器,直接用setSelected方法就可以切换图片了,为true是切换为shape_circle_blue_press.xml,否则为shape_ring_black_normal.xml,记得选择器的默认item一定要在最后,否则没有效果。你也可以直接在切换页面的时候替换图片资源。

selector_circle.xml(小圆点选择器)

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

  <item android:state_selected="true" android:drawable="@drawable/shape_circle_blue_press"/>
  <item android:drawable="@drawable/shape_ring_black_normal"/> 

</selector>

页面布局很简单,ViewPage是重点来显示主要内容,再来一排ImageView显示小圆点,由于我们在最后一个页面需要有个按钮来跳转到主界面,这里我们加个Button先隐藏。

activity_guide.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:gravity="center"
  android:layout_height="match_parent"> 

  <Button
    android:id="@+id/btn_goto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:visibility="gone"
    android:text="跳转" /> 

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

  <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="24dp"
    android:orientation="horizontal"> 

    <ImageView
      android:id="@+id/imgv_circler1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/selector_circle"
      android:layout_margin="24dp"/> 

    <ImageView
      android:id="@+id/imgv_circler2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="24dp"
      android:src="@drawable/selector_circle"/> 

    <ImageView
      android:id="@+id/imgv_circler3"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="24dp"
      android:src="@drawable/selector_circle"/> 

  </LinearLayout> 

</RelativeLayout> 

还有一步准备工作,添加每个页面的数据源,继承PagerAdapter这个类

GuideAdapter.java

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import java.util.List; 

public class GuideAdapter extends PagerAdapter { 

  private List<View> mDatas; 

  public GuideAdapter(List<View> datas) {
    this.mDatas = datas;
  } 

  @Override
  public int getCount() {
    return mDatas != null ? mDatas.size() : 0;
  } 

  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    container.addView(mDatas.get(position), 0);
    return mDatas.get(position);
  } 

  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView(mDatas.get(position));
  } 

  @Override
  public boolean isViewFromObject(View view, Object object) {
    return view == object;
  }
}

接下来就看看如何实现,代码很简单,不难看懂,直接贴出来。

GuideAdapter.java

import android.content.Intent;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout; 

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

public class GuideActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { 

  private ViewPager vp;
  private List<View> mDatas = new ArrayList<>();
  private Button btn;
  private GuideAdapter mGuideAdapter; 

  private int[] res = {
      R.mipmap.ic_launcher,
      R.mipmap.ic_launcher,
      R.mipmap.ic_launcher
  }; 

  private ImageView[] imgv = new ImageView[res.length]; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_guide); 

    initViews();
    initDatas();
    initEvents();
  } 

  private void initViews() {
    vp = (ViewPager) findViewById(R.id.vp);
    btn = (Button) findViewById(R.id.btn_goto);
    imgv[0] = (ImageView) findViewById(R.id.imgv_circler1);
    imgv[1] = (ImageView) findViewById(R.id.imgv_circler2);
    imgv[2] = (ImageView) findViewById(R.id.imgv_circler3);
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
    for (int i = 0; i < res.length; i++) {
      ImageView imgv = new ImageView(this);
      imgv.setLayoutParams(params);
      imgv.setImageResource(res[i]);
      mDatas.add(imgv);
    }
  } 

  private void initDatas() {
    selectedDoto(0);
    mGuideAdapter = new GuideAdapter(mDatas);
    vp.setAdapter(mGuideAdapter);
  } 

  private void selectedDoto(int index) {
    for (int i = 0; i < res.length; i++) {
      if (i == index) {
        imgv[i].setSelected(true);
      } else {
        imgv[i].setSelected(false);
      }
    }
  } 

  private void initEvents() {
    vp.setOnPageChangeListener(this);
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(GuideActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
      }
    });
  } 

  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

  @Override
  public void onPageSelected(int position) {
    if (position == res.length-1) // 如果是最后一个页面显示跳转按钮
      btn.setVisibility(View.VISIBLE);
    else
      btn.setVisibility(View.GONE);
    selectedDoto(position);
  } 

  @Override
  public void onPageScrollStateChanged(int state) {}
}

那如果每个页面不是一个控件这么简单呢?这时我们用Fragment,布局上还是差不多,但最后页面的按钮我们可以转移到最后一个Fragment布局上,因此直接删除Button,这里就不能继承Activity,要基础FragmentActivity。
接着我们就要弄三个Fragment出来,这里布局只简单放了个TextView,最后的页面还有个Button。我们就看看最后一个Fragment就好了。

fragment_guidec.xml

<FrameLayout 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.newcentury.testdemo.GuidecFragment"> 

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:drawableTop="@mipmap/ic_launcher"
    android:textSize="18sp"
    android:text="页面三"/> 

  <Button
    android:id="@+id/btn_goto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="跳转"/> 

</FrameLayout>

GuidecFragment.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; 

public class GuidecFragment extends Fragment { 

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
               Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_guidec, container, false);
    view.findViewById(R.id.btn_goto).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent(getActivity(), MainActivity.class);
        startActivity(intent);
        getActivity().finish();
      }
    });
    return view;
  } 

}

当然在前面用到的Adapter是用不了了,这里需要继承FragmentPagerAdapter类。

GuideAdapter.java

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List; 

public class GuideAdapter extends FragmentPagerAdapter { 

  private List<Fragment> mDatas; 

  public GuideAdapter(FragmentManager fm, List<Fragment> datas) {
    super(fm);
    this.mDatas = datas;
  } 

  @Override
  public Fragment getItem(int position) {
    return mDatas.get(position);
  } 

  @Override
  public int getCount() {
    return mDatas.size();
  }
}

GuideActivity.java

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView; 

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

public class GuideActivity extends FragmentActivity implements ViewPager.OnPageChangeListener { 

  private ViewPager vp;
  private List<Fragment> mDatas = new ArrayList<>();
  private GuideAdapter mGuideAdapter; 

  private int[] res = {
      R.mipmap.ic_launcher,
      R.mipmap.ic_launcher,
      R.mipmap.ic_launcher
  }; 

  private ImageView[] imgv = new ImageView[res.length]; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_guide); 

    initViews();
    initDatas();
    initEvents();
  } 

  private void initViews() {
    vp = (ViewPager) findViewById(R.id.vp);
    imgv[0] = (ImageView) findViewById(R.id.imgv_circler1);
    imgv[1] = (ImageView) findViewById(R.id.imgv_circler2);
    imgv[2] = (ImageView) findViewById(R.id.imgv_circler3);
  } 

  private void initDatas() {
    selectedDoto(0);
    mDatas.add(new GuideaFragment());
    mDatas.add(new GuidebFragment());
    mDatas.add(new GuidecFragment());
    mGuideAdapter = new GuideAdapter(getSupportFragmentManager(), mDatas);
    vp.setAdapter(mGuideAdapter);
  } 

  private void selectedDoto(int index) {
    for (int i = 0; i < res.length; i++) {
      if (i == index) {
        imgv[i].setSelected(true);
      } else {
        imgv[i].setSelected(false);
      }
    }
  } 

  private void initEvents() {
    vp.setOnPageChangeListener(this);
  } 

  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 

  @Override
  public void onPageSelected(int position) {
    selectedDoto(position);
  } 

  @Override
  public void onPageScrollStateChanged(int state) {}
}

实现效果如下:

       

从上面还可以看到一个倒计时,那是怎么实现倒计时自动跳转呢?我们可以直接开个线程完成倒计时操作,当计时为0时便自动跳转,但用户很可能会回滑到上一个界面,也可能用户会手动点击跳转按钮进行跳转,因此,要把控好线程的关闭与开启。代码贴出来如下:

public void AutoGotoThread(boolean start) {
  if (start) {
    mGotoMainThread = new GotoMainThread();
    mGotoMainThread.start();
  } else {
    if (mGotoMainThread != null && mGotoMainThread.isAlive()) {
      mGotoMainThread.stopThread();
    }
  }
} 

private void startActivity() {
  Intent intent = new Intent(getActivity(), MainActivity.class);
  startActivity(intent);
  mGotoMainThread.stopThread();
  getActivity().finish();
} 

private class GotoMainThread extends Thread {
  private volatile boolean isRun = true;
  private Object lock = new Object(); 

  @Override
  public void run() {
    synchronized (lock) {
      while (isRun) {
        try {
          Message msg = Message.obtain();
          msg.what = 101;
          msg.obj = "跳转 " + mTimeValues--;
          mHandler.sendMessage(msg);
          sleep(1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        } 

      }
    }
  } 

  public void stopThread() {
    mTimeValues = 5;
    isRun = false;
  }
} 

final Handler mHandler = new Handler() {
  public void handleMessage(Message msg) {
    switch (msg.what) {
      case 101:
        btn.setText((String) msg.obj);
        if (mTimeValues < 0) {
          startActivity();
        }
        break;
    }
  }
};

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

(0)

相关推荐

  • Android绘制炫酷引导界面

    一个超炫的引导界面,分享给大家 代码: MainActivity.java package com.bzu.gxs.webview1; import android.app.Activity; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.KeyEvent; import android.view.Men

  • Android应用自动跳转到应用市场详情页面的方法

    前言 众所周知在Android应用开发过程中,可能会有需求,比如:推广时跳转到应用市场下载应用,跳转到应用市场给自己的应用打分,跳转到应用市场更新自己的应用. 那如何跳转到应用市场呢? 可能跳转的方法大家都是知道的,方法如下: public static void goToMarket(Context context, String packageName) { Uri uri = Uri.parse("market://details?id=" + packageName); Int

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

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

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

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

  • android 引导界面的实现方法

    复制代码 代码如下: /** * 实现 * @author dujinyang * */ 顺序是: OneAcitivity  -->MainActivity -> TwoActivity 然后第2次进去就是:OneActivity -> TwoActivity 代码里都有注释的了,这里就不多说了.OneActivity的代码如下: [java] 复制代码 代码如下: package cn.djy.activity; import android.app.Activity; import

  • 很赞的引导界面效果Android控件ImageSwitcher实现

    本文实例为大家分享了Android控件ImageSwitcher实现引导界面的代码,供大家参考,具体内容如下 效果图: 布局代码: <?xml version="1.0" encoding="UTF-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent&

  • Android 新手引导蒙层效果实现代码示例

    先上效果图: 这个效果一开始我是想直接让UI给个切图,后来发现这样不行,适配很差,达不到效果.所以就自己动手写代码,其实思路也很简单:在这个布局的父布局上面再手动添加一个view(通常LinearLayout比较方便),然后把这个linearlayout的背景设置成#88000000,之后就是给这个linearlayout动态增加子view,初步效果就能达到. 下面直接上代码: public void showGuideView() { View view = getWindow().getDe

  • android实现App活动定时自动跳转效果

    App的小功能点,很简单几十行代码就可以实现 主页面代码 package com.buildingbuilding; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.WindowManag

  • Android引导页面的简单实现

    第一次进入应用的时候,都会有一个引导页面,引导页面的实现起来也很简单,实现的方式也有很多,下面是自己写的一个引导页面的效果,大致的实现思路为: 最外层是一个FragmentActivity,里面包含4个fragment,在fragment中给ViewPager开一个循环,这样实现了图片播,其实效果就是在FragmentActivity中几个fragment滑动切换, fragment中ViewPager无限轮播和滑动切换: 下面为代码实现: public class MainActivity e

  • ViewPager实现带引导小圆点与自动跳转的引导界面

    实现引导小圆点的方法其实很简单,可直接在布局上放置与引导页面等量的ImageView,然后在切换页面的时候更改图片资源就好了.这里顺便提一下,有些APP是干脆在制作引导页面图片的时候加上引导小圆点,这种方式显然最简单不过了,但是既然是附在图片上的,在切换的时候也是随着图片滑动的,显然看起来效果并不是很好,甚至在我们需要加入小圆点的切换动画时,那就更不能这么去做了. 首先我们先来看看实现效果 这里我们的小圆点图片资源是采用shape绘制的,这里我弄的很随便,所以很粗糙,如果觉得不是很美观那就自行修

  • Android ViewPager导航小圆点实现无限循环效果

    之前用View Pager做了一个图片切换的推荐栏(就类似与淘宝.头条客户端顶端的推荐信息栏),利用View Pager很快就能实现,但是一次无意间使用淘宝APP的时候,突然发现它的效果和我做的还不一样,淘宝APP的推荐栏可以左右无限循环切换,而ViewPager自身其实并没有支持这个功能. 其实实现这个无限循环不难,只需要在数据源的首尾各添加一张多余的图片,在onPagerChangeListener()中监听position<1和position>(总数据条目-1)就可以了.另外一点需要注

  • Android viewpager自动轮播和小圆点联动效果

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 首先来看一下我们要做成的而效果: 主页面要显示一个viewpager自动轮播+小圆点联动的效果 : 废话不多说,直接上代码: 布局文件: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andro

  • Android利用ViewPager实现带小圆球的图片滑动

    在上文实现的带小圆球的图片滑动的通用性较好,但是较复杂. 现在也是利用 ViewPager ,但是却没有利用 ShapeDrawable 来实现带小圆球的图片滑动.如有些播放器一样,在开始安装 app 时,都会出现引导界面,然后才进入主界面,但是在重新启动 app 时却不会再出现该引导界面. 下面实现的就是该类似的功能,只是把引导界面都做成了图片显示,这样更能够体现不同的做法(和上一篇博客). 本例主要主要:在小圆点的绘制和 viewpager 相关联起来. 如下效果: MyPagerAdapt

  • Android ViewPager小圆点指示器

    一个很常用的功能,一个ViewPager会自动滚动,并且有一排小圆点黑和白来指示当前的滚动进度 首先写一个ViewPager的适配器,这里这个适配器为了方便里面的元素全都是ImageView import android.content.Context; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import a

  • JQuery和html+css实现带小圆点和左右按钮的轮播图实例

    是的!你没看错!还是轮播图.这次的JQuery的哟!! CSS代码: /*轮播图 左右按钮 小白点*/ #second_div{ margin-top: 160px; } .img_box{ overflow: hidden; width:100%; height:420px; border:1px solid; position:relative; } .img_box img{ width:100%; position:absolute; } .ul5{ list-style: none;

  • Android ViewPager无限循环实现底部小圆点动态滑动

    页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页 同时,底部红色小圆点随着页面的滑动距离比例随时改变位置 布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas

  • Android 滑动小圆点ViewPager的两种设置方法详解流程

    第一种方法: 一.测试如下,直接设置小圆点不是图标 二.准备工作 1.在drawable创建dot.xml,设置小圆点,比较方便 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="t

  • C#实现微信跳一跳小游戏的自动跳跃助手开发实战

    一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏"跳一跳"在各朋友圈里又火了起来,类似以前的"打飞机"游戏,这游戏玩法简单,但加上了积分排名功能后,却成了"装逼"的地方,于是很多人花钱花时间的刷积分抢排名.后来越来越多的聪明的"程序哥们"弄出了不同方式不同花样的跳一跳助手(外挂?),有用JS实现的.有JAVA实现的.有Python实现的,有直接物理模式的.有机械化的.有量尺子的等等,简直是百花齐放啊-- 赶一下潮流

  • 微信小程序云开发 生成带参小程序码流程

    本文实例为大家分享了小程序生成带参小程序码的具体步骤,供大家参考,具体内容如下 生成带参小程序码流程 1.小程序端上传生成二维码所需的参数到云函数 2.云函数使用appid和appsecret请求access_token 3.云函数使用access_token + 小程序端上传的参数生成二维码 4.云函数将生成的二维码返回到小程序端(或者存到数据库返回fileID,小程序端用fileID进行获取,后续生成先在数据库查找,数据库没有再执行生成操作,防止重复生成小程序码文件) 小程序端上传小程序码所

随机推荐