ViewPager實(shí)現(xiàn)實(shí)現(xiàn)APP引導(dǎo)頁

一:摘要

這篇文章主要為大家介紹了使用ViewPager來實(shí)現(xiàn)android中常見的引導(dǎo)頁,具有一定的參考價值抄囚,感興趣的小伙伴們可以參考一下。

下面我們先來看一下要實(shí)現(xiàn)的效果吧!

二:具體實(shí)現(xiàn)過程

1.創(chuàng)建一個工程王污,修改主布局為線性布局描滔,

加入androidx.viewpager.widget.ViewPager標(biāo)簽,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. 在調(diào)用mViewPager.setAdapter();之前祖灰,我們要創(chuàng)建視圖數(shù)據(jù)。接下來創(chuàng)建視圖數(shù)據(jù)畔规。

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

部分代碼:

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

};

5.新建R.layout.view_first局扶,……相對布局文件并設(shè)置內(nèi)容。alt+enter快捷鍵

6. List<View> mViews=new ArrayList<>();創(chuàng)建一個視圖集合保存視圖對象叁扫。ctrl+alt+F提取為全局變量

部分代碼:

mViews = new ArrayList<>();

7.利用for循環(huán)添加視圖對象到視圖集合三妈。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.視圖有了,就要創(chuàng)建一個Adapter(全局變量)

10.創(chuàng)建一個PagerAdapter, 手動添加兩個要實(shí)現(xiàn)的方法destroyItem & instantiateItem莫绣。ctrl+o

部分代碼:

//創(chuàng)建一個PagerAdapter,注意結(jié)尾的分號畴蒲。
// 手動添加兩個要實(shí)現(xiàn)的方法destroyItem & instantiateItem
//重寫好mPagerAdapter的方法就可以設(shè)置mViewPager的適配器了
PagerAdapter mPagerAdapter=new PagerAdapter() {
   @Override
   public int getCount() {
       //返回頁面的數(shù)量
       return mLayoutIDs.length;
   }

   @Override
   public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
       //判斷當(dāng)前視圖是不是該對象,object是instantiateItem返回的对室。相同的話后面就可以復(fù)用饿凛。
       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) {
       //獲取當(dāng)前的視圖
       View child=mViews.get(position);
       //把視圖加載進(jìn)來
       container.addView(child);
       //同時把該視圖返回
       return child;
   }
};

11.重寫好mPagerAdapter的方法就可以設(shè)置mViewPager的適配器了。

mViewPager.setAdapter(mPagerAdapter);

至此软驰,就可以出現(xiàn)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中添加設(shè)置點(diǎn)要用到的兩個全局變量

部分代碼:

private ViewGroup mDotViewGroup;

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

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

mDotViewGroup = findViewById(R.id.dot_layout);

15.開始在for循環(huán)里添加點(diǎn)纠吴,為每個點(diǎn)創(chuàng)建一個ImageView對象

ImageView dot = new ImageView(this);

16.設(shè)置點(diǎn)的圖片,修改一下圖片大小

部分代碼:

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

17.創(chuàng)建LinearLayout.LayoutParams對象并做屬性設(shè)置

部分代碼:

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

18.把dot加進(jìn)mDotViews,mDotViewGroup

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

19.給mViewPager設(shè)置監(jiān)聽器慧瘤。

addOnPageChangeListener

部分代碼:

 //在onPageSelected中設(shè)置點(diǎn)的圖片戴已,可利用for循環(huán)

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 三目運(yùn)算符固该,右結(jié)合,a為真時糖儡,選b,否則選c

}
//然后crtl+alt_m提取該循環(huán)為一個函數(shù)伐坏。

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 三目運(yùn)算符,右結(jié)合握联,a為真時桦沉,選b,否則選c

}
}

20.設(shè)置默認(rèn)的頁面序號

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

同時注意默認(rèn)的頁面序號設(shè)置為0時請調(diào)用一次setDotViews

至此纯露,全部功能已實(shí)現(xiàn)。

我們先看看默認(rèn)的頁面序號設(shè)置為0時沒有調(diào)用setDotViews的情況代芜。

有沒有發(fā)現(xiàn)一開始在0頁面時沒有小星星呢埠褪?

tips:默認(rèn)的頁面序號設(shè)置為0時,調(diào)用setDotViews的效果就是文章開篇是展示的效果圖挤庇,小伙伴們可以比較一下哦钞速。

下面附上全部代碼,僅供學(xué)習(xí)交流嫡秕。


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渴语,……相對布局文件并設(shè)置內(nèi)容。alt+enter快捷鍵
   };
   private List<View> mViews;
   //添加設(shè)置點(diǎn)要用到的兩個全局變量
   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();前要創(chuàng)建視圖數(shù)據(jù)
       //創(chuàng)建視圖數(shù)據(jù),添加全局變量int[] mLayoutIDs
       //List<View> mViews=new ArrayList<>();創(chuàng)建一個視圖集合保存視圖對象淘菩。ctrl+alt+F提取為全局變量
       mViews = new ArrayList<>();

       //設(shè)置點(diǎn)之前mDotViewGroup先把初始化
       mDotViewGroup = findViewById(R.id.dot_layout);

       //利用for循環(huán)添加視圖對象到視圖集合遵班。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循環(huán)里添加點(diǎn)屠升,為每個點(diǎn)創(chuàng)建一個ImageView對象
           ImageView dot = new ImageView(this);
           //設(shè)置點(diǎn)的圖片,修改一下圖片大小
           dot.setImageResource(R.mipmap.ic_launcher);
           dot.setMaxHeight(100);
           dot.setMaxWidth(100);
           //創(chuàng)建LinearLayout.LayoutParams對象并做屬性設(shè)置
           LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);
           layoutParams.leftMargin = 20;//點(diǎn)距離左邊的點(diǎn)為20
           dot.setLayoutParams(layoutParams);
           dot.setEnabled(false);//設(shè)置不可用
           //把dot加進(jìn)mDotViews潮改,mDotViewGroup
           mDotViews.add(dot);
           mDotViewGroup.addView(dot);

       }
       //視圖有了,就要創(chuàng)建一個PagerAdapter(全局)

       //設(shè)置mViewPager的適配器
       mViewPager.setAdapter(mPagerAdapter);

       //設(shè)置默認(rèn)的頁面序號mViewPager.setCurrentItem(0);腹暖。把0提取為常量汇在。ctrl+alt+c
       mViewPager.setCurrentItem(INIT_POSITION);
       //默認(rèn)的頁面序號設(shè)置為0時請調(diào)用一次setDotViews
       setDotViews(INIT_POSITION);

       //給mViewPager設(shè)置監(jiān)聽器。
       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);
       }
   }

   //創(chuàng)建一個PagerAdapter,注意結(jié)尾的分號脏答。
   // 手動添加兩個要實(shí)現(xiàn)的方法destroyItem & instantiateItem糕殉。ctrl+o
   //重寫好mPagerAdapter的方法就可以設(shè)置mViewPager的適配器了
   PagerAdapter mPagerAdapter=new PagerAdapter() {
       @Override
       public int getCount() {
           //返回頁面的數(shù)量
           return mLayoutIDs.length;
       }

       @Override
       public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
           //判斷當(dāng)前視圖是不是該對象,object是instantiateItem返回的殖告。相同的話后面就可以復(fù)用阿蝶。
           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) {
           //獲取當(dāng)前的視圖
           View child=mViews.get(position);
           //把視圖加載進(jìn)來
           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和上面的類似。

歡迎小伙伴們批評指正黄绩!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羡洁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爽丹,更是在濱河造成了極大的恐慌筑煮,老刑警劉巖辛蚊,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異真仲,居然都是意外死亡袋马,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門秸应,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虑凛,“玉大人,你說我怎么就攤上這事灸眼∥蚤埽” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵焰宣,是天一觀的道長霉囚。 經(jīng)常有香客問我,道長匕积,這世上最難降的妖魔是什么盈罐? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮闪唆,結(jié)果婚禮上盅粪,老公的妹妹穿的比我還像新娘。我一直安慰自己悄蕾,他們只是感情好票顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帆调,像睡著了一般奠骄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上番刊,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天含鳞,我揣著相機(jī)與錄音,去河邊找鬼芹务。 笑死蝉绷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枣抱。 我是一名探鬼主播熔吗,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佳晶!你這毒婦竟也來了桅狠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垂攘,沒想到半個月后维雇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晒他,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年吱型,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陨仅。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡津滞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灼伤,到底是詐尸還是另有隱情触徐,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布狐赡,位于F島的核電站撞鹉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颖侄。R本人自食惡果不足惜鸟雏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望览祖。 院中可真熱鬧孝鹊,春花似錦、人聲如沸展蒂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锰悼。三九已至柳骄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間松捉,已是汗流浹背夹界。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工馆里, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隘世,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓鸠踪,卻偏偏與公主長得像丙者,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子营密,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361