美文网首页
ViewPager实现实现APP引导页

ViewPager实现实现APP引导页

作者: 块码加编 | 来源:发表于2020-08-13 10:18 被阅读0次

一:摘要

这篇文章主要为大家介绍了使用ViewPager来实现android中常见的引导页,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

下面我们先来看一下要实现的效果吧!

二:具体实现过程

1.创建一个工程,修改主布局为线性布局,

加入androidx.viewpager.widget.ViewPager标签,id为view_pager

部分代码:

<androidx.viewpager.widget.ViewPager

    android:id="@+id/view_pager"

    android:layout_width="match_parent"

    android:layout_height="0dp"

    android:layout_weight="1">

</androidx.viewpager.widget.ViewPager>

2.在MainActivity把ViewPager引用出来并提取为全局变量。

部分代码:

mViewPager = findViewById(R.id.view_pager);

3. 在调用mViewPager.setAdapter();之前,我们要创建视图数据。接下来创建视图数据。

4.添加全局变量int[] mLayoutIDs

部分代码:

private int[] mLayoutIDs={
       R.layout.view_first,
       R.layout.view_second,
       R.layout.view_third

};

5.新建R.layout.view_first,……相对布局文件并设置内容。alt+enter快捷键

6. List<View> mViews=new ArrayList<>();创建一个视图集合保存视图对象。ctrl+alt+F提取为全局变量

部分代码:

mViews = new ArrayList<>();

7.利用for循环添加视图对象到视图集合。fori快捷键

8.通过.xml文件反向生成视图对象并添加视图对象到视图集合

部分代码:

for (int index = 0; index < mLayoutIDs.length; index++) {

    //通过.xml文件反向生成视图对象并添加视图对象到视图集合
    //写法1:

    //views.add(getLayoutInflater().inflate(mLayoutIDs[index],null));
    //写法2:

    //利用ctrl+alt+v快捷键

    //把getLayoutInflater().inflate(mLayoutIDs[index],null)提取为变量
   View inflate = getLayoutInflater().inflate(mLayoutIDs[index], null);
   mViews.add(inflate);

9.视图有了,就要创建一个Adapter(全局变量)

10.创建一个PagerAdapter, 手动添加两个要实现的方法destroyItem & instantiateItem。ctrl+o

部分代码:

//创建一个PagerAdapter,注意结尾的分号。
// 手动添加两个要实现的方法destroyItem & instantiateItem
//重写好mPagerAdapter的方法就可以设置mViewPager的适配器了
PagerAdapter mPagerAdapter=new PagerAdapter() {
   @Override
   public int getCount() {
       //返回页面的数量
       return mLayoutIDs.length;
   }

   @Override
   public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
       //判断当前视图是不是该对象,object是instantiateItem返回的。相同的话后面就可以复用。
       return view==object;
   }

   @Override
   public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
       //把视图移除
       container.removeView(mViews.get(position));
   }

   @NonNull
   @Override
   public Object instantiateItem(@NonNull ViewGroup container, int position) {
       //获取当前的视图
       View child=mViews.get(position);
       //把视图加载进来
       container.addView(child);
       //同时把该视图返回
       return child;
   }
};

11.重写好mPagerAdapter的方法就可以设置mViewPager的适配器了。

mViewPager.setAdapter(mPagerAdapter);

至此,就可以出现3个滑动页面了。

我们可以看一下效果。

12.主布局添加一个id为dot_layout的LinearLayout。

部分代码:

  android:layout_width="match_parent"

  android:layout_height="100dp"

13. 主布局ViewPager的宽高修改为

部分代码:

    android:layout_width="match_parent"

    android:layout_height="0dp"

    android:layout_weight="1"

14.MainActivity中添加设置点要用到的两个全局变量

部分代码:

private ViewGroup mDotViewGroup;

private List<ImageView> mDotViews = new ArrayList<>();

//在MainActivity的onCreate方法中先把mDotViewGroup初始化

mDotViewGroup = findViewById(R.id.dot_layout);

15.开始在for循环里添加点,为每个点创建一个ImageView对象

ImageView dot = new ImageView(this);

16.设置点的图片,修改一下图片大小

部分代码:

dot.setImageResource(R.mipmap.ic_launcher);
dot.setMaxHeight(100);
dot.setMaxWidth(100);

17.创建LinearLayout.LayoutParams对象并做属性设置

部分代码:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);

18.把dot加进mDotViews,mDotViewGroup

mDotViews.add(dot);
mDotViewGroup.addView(dot);

19.给mViewPager设置监听器。

addOnPageChangeListener

部分代码:

 //在onPageSelected中设置点的图片,可利用for循环

for (int index = 0; index < mDotViews.size(); index++) {

    mDotViews.get(index).setImageResource(position == index ?R.mipmap.star:R.mipmap.ic_launcher);
    //a ? b:c a 三目运算符,右结合,a为真时,选b,否则选c

}
//然后crtl+alt_m提取该循环为一个函数。

private void setDotViews(int position) {

for (int index = 0; index < mDotViews.size(); index++) {

    mDotViews.get(index).setImageResource(position == index ?R.mipmap.star:R.mipmap.ic_launcher);
    //a ? b:c a 三目运算符,右结合,a为真时,选b,否则选c

}
}

20.设置默认的页面序号

mViewPager.setCurrentItem(0);把0提取为常量。ctrl+alt+c。

同时注意默认的页面序号设置为0时请调用一次setDotViews

至此,全部功能已实现。

我们先看看默认的页面序号设置为0时没有调用setDotViews的情况。

有没有发现一开始在0页面时没有小星星呢?

tips:默认的页面序号设置为0时,调用setDotViews的效果就是文章开篇是展示的效果图,小伙伴们可以比较一下哦。

下面附上全部代码,仅供学习交流。


MainActivity.java

package com.wxdgut.viewpager;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

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

public class MainActivity extends AppCompatActivity {

   public static final int INIT_POSITION = 0;
   private ViewPager mViewPager;
   private int[] mLayoutIDs={
           R.layout.view_first,
           R.layout.view_second,
           R.layout.view_third
           //新建R.layout.view_first,……相对布局文件并设置内容。alt+enter快捷键
   };
   private List<View> mViews;
   //添加设置点要用到的两个全局变量
   private ViewGroup mDotViewGroup;
   private List<ImageView> mDotViews = new ArrayList<>();

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       mViewPager = findViewById(R.id.view_pager);
       //mViewPager.setAdapter();前要创建视图数据
       //创建视图数据,添加全局变量int[] mLayoutIDs
       //List<View> mViews=new ArrayList<>();创建一个视图集合保存视图对象。ctrl+alt+F提取为全局变量
       mViews = new ArrayList<>();

       //设置点之前mDotViewGroup先把初始化
       mDotViewGroup = findViewById(R.id.dot_layout);

       //利用for循环添加视图对象到视图集合。fori快捷键
       for (int index = 0; index < mLayoutIDs.length; index++) {
           //通过.xml文件反向生成视图对象并添加视图对象到视图集合
           //写法1:views.add(getLayoutInflater().inflate(mLayoutIDs[index],null));
           //写法2:利用ctrl+alt+v快捷键把getLayoutInflater().inflate(mLayoutIDs[index],null)提取为变量
           View inflate = getLayoutInflater().inflate(mLayoutIDs[index], null);
           mViews.add(inflate);

           /*如果只是想简单放张图片的话也可以直接new对象
           ImageView imageView = new ImageView(this);
           imageView.setImageResource(R.mipmap.ic_launcher);
           mViews.add(imageView);
           */

           //开始在for循环里添加点,为每个点创建一个ImageView对象
           ImageView dot = new ImageView(this);
           //设置点的图片,修改一下图片大小
           dot.setImageResource(R.mipmap.ic_launcher);
           dot.setMaxHeight(100);
           dot.setMaxWidth(100);
           //创建LinearLayout.LayoutParams对象并做属性设置
           LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);
           layoutParams.leftMargin = 20;//点距离左边的点为20
           dot.setLayoutParams(layoutParams);
           dot.setEnabled(false);//设置不可用
           //把dot加进mDotViews,mDotViewGroup
           mDotViews.add(dot);
           mDotViewGroup.addView(dot);

       }
       //视图有了,就要创建一个PagerAdapter(全局)

       //设置mViewPager的适配器
       mViewPager.setAdapter(mPagerAdapter);

       //设置默认的页面序号mViewPager.setCurrentItem(0);。把0提取为常量。ctrl+alt+c
       mViewPager.setCurrentItem(INIT_POSITION);
       //默认的页面序号设置为0时请调用一次setDotViews
       setDotViews(INIT_POSITION);

       //给mViewPager设置监听器。
       mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
           @Override
           public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

           }

           @Override
           public void onPageSelected(int position) {
               setDotViews(position);

           }

           @Override
           public void onPageScrollStateChanged(int state) {

           }
       });

   }

   private void setDotViews(int position) {
       for (int index = 0; index < mDotViews.size(); index++) {
           mDotViews.get(index).setImageResource(index==position ? R.mipmap.star:R.mipmap.ic_launcher);
       }
   }

   //创建一个PagerAdapter,注意结尾的分号。
   // 手动添加两个要实现的方法destroyItem & instantiateItem。ctrl+o
   //重写好mPagerAdapter的方法就可以设置mViewPager的适配器了
   PagerAdapter mPagerAdapter=new PagerAdapter() {
       @Override
       public int getCount() {
           //返回页面的数量
           return mLayoutIDs.length;
       }

       @Override
       public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
           //判断当前视图是不是该对象,object是instantiateItem返回的。相同的话后面就可以复用。
           return view==object;
       }

       @Override
       public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
           //把视图移除
           container.removeView(mViews.get(position));
       }

       @NonNull
       @Override
       public Object instantiateItem(@NonNull ViewGroup container, int position) {
           //获取当前的视图
           View child=mViews.get(position);
           //把视图加载进来
           container.addView(child);
           //同时把该视图返回
           return child;
       }
   };
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_height="match_parent"
   tools:context=".MainActivity"
   android:orientation="vertical">

   <androidx.viewpager.widget.ViewPager
       android:id="@+id/view_pager"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="1">
   </androidx.viewpager.widget.ViewPager>

   <LinearLayout
       android:id="@+id/dot_layout"
       android:layout_width="match_parent"
       android:layout_height="100dp"
       android:orientation="horizontal"
       android:layout_marginBottom="20dp"
       android:gravity="center"
       ></LinearLayout>

</LinearLayout>

view_first.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="页面1"
       android:textSize="25sp"
       android:layout_centerInParent="true"/>

</RelativeLayout>

view_second.xml与view_third.xml和上面的类似。

欢迎小伙伴们批评指正!

相关文章

网友评论

      本文标题:ViewPager实现实现APP引导页

      本文链接:https://www.haomeiwen.com/subject/utcbdktx.html