天天看點

ViewPager實作App引導頁面

ViewPager使用App引導頁面

相關代碼已經上傳到 倉庫 的ViewPager檔案夾内
ViewPager實作App引導頁面

viewPager實作引導頁面.gif

項目的基礎配置就不多做贅述了,不清楚的可以檢視我的這篇 文章
ViewPager實作App引導頁面

結構目錄.png

頁面是由8張圖檔組成的,分别是4張透明背景的文字圖檔和4張黑底的圖檔圖檔
ViewPager實作App引導頁面

圖檔素材.png

文字滑動

在module包下建立guide包,建立GuideActivity
import kotlinx.android.synthetic.main.activity_guide.*
/**
 * 引導頁面
 */
class GuideActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_guide)
    }
}
           

1) 建立res-drawable-hdpi檔案夾,這一步很關鍵,因為我們的素材檔案有點大,如果不放在hdpi檔案夾,而是放在普通的drawable檔案夾内的話很可能會出現OOM記憶體溢出異常.

2) 把我們的4張文字圖檔和4張圖示素材拷到檔案夾内

3) 書寫activity_guide.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:orientation="vertical"
    tools:context=".module.guide.GuideActivity">

    <!--用來顯示圖示圖檔-->
    <ImageView
        android:id="@+id/mImageViews"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!--用來顯示文字圖檔,其實我們滑動的僅僅是文字圖檔而已,後面的圖示變化是我們去監聽文字圖檔的滑動位置再去設定改變的-->
    <android.support.v4.view.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

</android.support.constraint.ConstraintLayout>
           
回到GuideActivity
import kotlinx.android.synthetic.main.activity_guide.*

/**
 * 引導頁面
 */
class GuideActivity : WinActivity() {

    //滑動文字圖檔的int數組
    var ids = intArrayOf(R.drawable.guide_txt_a, R.drawable.guide_txt_b, R.drawable.guide_txt_c, R.drawable.guide_txt_d)

    //用來填充viewPager的ImageView集合
    private val imageViews = ArrayList<ImageView>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_guide)
        //初始化資料
        initData()
    }

    /**
     * 初始化資料
     */
    private fun initData() {
        //周遊ids數組,把ids資料的圖檔路徑傳到imageViews集合中
        for (i in ids.indices) {
            //通過代碼生成ImageView
            val imageView = ImageView(this)
            //設定生成的ImageView的背景
            imageView.setBackgroundResource(ids[i])
            //将設定好的ImageView添加到集合中
            imageViews.add(imageView)
        }
        //設定ViewPager擴充卡
        mViewPager.adapter = MyAdapter()
    }

    /**
     * 設定viewPager擴充卡
     * 這裡記得把MyAdapter加上inner關鍵字,聲明為内部類
     */
    inner class MyAdapter : PagerAdapter() {

        override fun isViewFromObject(view: View, `object`: Any): Boolean {
            return view == `object`
        }

        /**
         * 傳回資料中的中個數
         */
        override fun getCount(): Int {
            return imageViews.size
        }

        override fun instantiateItem(container: ViewGroup, position: Int): Any {
            var imageView: ImageView = imageViews.get(position)
            //添加到容器中
            container.addView(imageView)
            return imageView
        }

        override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
//            super.destroyItem(container, position, `object`)
            container.removeView(`object` as View?)
        }
    }
}
           

1)我們聲明了Int類型數組,該數組是用來存儲要顯示的文字圖檔的。還聲明了泛形為ImageView類型的imageViews集合,該集合是用來存儲我們要填充到viewPager上的ImageView的,

2)之後我們通過for循環把int數組的圖檔都設定到通過代碼生成的ImageView裡,并把這些生成的圖檔都填充到imageViews集合裡。

3)最後設定viewPager的擴充卡,資料源就是我們處理後的imageViews集合

ViewPager實作App引導頁面

文字圖檔滑動.gif

圖示變化

中間圖示的變化的實作方式是我們去監聽viewPager的滑動情況,當監聽到進入下一個頁面時,去設定相應的圖檔
/**
   * 初始化資料
   */
   private fun initData() {
        //viewPager滑動監聽
        mViewPager.addOnPageChangeListener(MyOnPageChangeListener())
       //...其它不變
    }

           
/**
 * 監聽ViewPager的滑動距離
 */
inner class MyOnPageChangeListener : ViewPager.OnPageChangeListener {

    override fun onPageScrollStateChanged(state: Int) {
    }

    /**
     * 當頁面滾動時
     * @param position 目前滑動頁面的位置
     */
    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        L.d("目前頁面的位置:$position")
        when (position) {
            0 -> mImageViews.setImageResource(R.drawable.guide_img_a)
            1 -> mImageViews.setImageResource(R.drawable.guide_img_b)
            2 -> mImageViews.setImageResource(R.drawable.guide_img_c)
            3 -> mImageViews.setImageResource(R.drawable.guide_img_d)
        }
    }

    override fun onPageSelected(position: Int) {

    }
}
           
ViewPager實作App引導頁面

圖示滑動.gif

完整代碼
import kotlinx.android.synthetic.main.activity_guide.*
import java.util.ArrayList

/**
 * 引導頁面
 */
class GuideActivity : WinActivity() {

    //用來填充布局的ImagView集合
    private val imageViews = ArrayList<ImageView>()

    //圖檔資料
    internal var ids = intArrayOf(R.drawable.guide_txt_a, R.drawable.guide_txt_b, R.drawable.guide_txt_c, R.drawable.guide_txt_d)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_guide)
        //初始化資料
        initData()
    }

    /**
     * 初始化資料
     */
    private fun initData() {
        //viewPager滑動監聽
        mViewPager.addOnPageChangeListener(MyOnPageChangeListener())
        //将圖檔添加到集合中
        for (i in ids.indices) {
            //          通過代碼生成ImageView
            val imageView = ImageView(this)
            //          設定imageView背景
            imageView.setBackgroundResource(ids[i])
            //          将生成的imagView添加到集合中去
            imageViews.add(imageView)
        }
        //設定viewPager擴充卡
        mViewPager.adapter = MyAdapter()
    }

    /**
     * 監聽ViewPager的滑動距離
     */
    inner class MyOnPageChangeListener : ViewPager.OnPageChangeListener {

        override fun onPageScrollStateChanged(state: Int) {
        }

        /**
         * 當頁面滾動時
         * @param position 目前滑動頁面的位置
         */
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
            L.d("目前頁面的位置:$position")
            when (position) {
                0 -> mImageViews.setImageResource(R.drawable.guide_img_a)
                1 -> mImageViews.setImageResource(R.drawable.guide_img_b)
                2 -> mImageViews.setImageResource(R.drawable.guide_img_c)
                3 -> mImageViews.setImageResource(R.drawable.guide_img_d)
            }
        }

        override fun onPageSelected(position: Int) {

        }
    }

    /**
     * ViewPager擴充卡
     */
    inner class MyAdapter : PagerAdapter() {
        /**
         * 傳回資料中的總個數
         */
        override fun getCount(): Int {
            return imageViews.size
        }

        override fun isViewFromObject(view: View, `object`: Any): Boolean {
            return view == `object`
        }

        /**
         * 将資料添加到集合中
         */
        override fun instantiateItem(container: ViewGroup, position: Int): Any {
            var imageView: ImageView = imageViews.get(position);
            //添加到容器中
            container.addView(imageView)
            return imageView
        }

        /**
         * 銷毀識圖
         */
        override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
//            super.destroyItem(container, position, `object`)
            container.removeView(`object` as View?)
        }
    }
}
           

按鈕和文字

在drawable檔案夾内建立guide_button.xml,用來設定按鈕的背景
<?xml version="1.0" encoding="utf-8" ?>
<!--相當于做了一張圓角的圖檔,然後給button作為背景圖檔-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!--設定背景色-->
    <solid android:color="#24C68A" />
    <!--設定圓角-->
    <corners android:radius="305dp" />
    <!--<padding-->
    <!--android:bottom="10dp"-->
    <!--android:left="10dp"-->
    <!--android:right="10dp"-->
    <!--android:top="10dp"-->
    <!--/>-->
    <!--設定邊框線的寬度和顔色-->
    <stroke android:width="1dp" android:color="#24C68A" />
</shape>
           
最後在xml布局把按鈕和文字寫上
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:background="@android:color/black"
    tools:context=".module.guide.GuideActivity">

    <!--用來顯示圖示圖檔-->
    <ImageView
        android:id="@+id/mImageViews"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!--用來顯示文字圖檔,其實我們滑動的僅僅是文字圖檔而已,後面的圖示變化是我們去監聽文字圖檔的滑動位置再去設定改變的-->
    <android.support.v4.view.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

    <!-- app:layout_constraintBottom_toBottomOf="parent" 控件自身的底部與父控件的底部對齊-->
    <Button
        android:id="@+id/mRegister"
        android:layout_width="match_parent"
        android:layout_height="49dp"
        android:layout_marginBottom="58dp"
        android:layout_marginLeft="34dp"
        android:layout_marginRight="34dp"
        android:background="@drawable/guide_button"
        android:padding="8dp"
        android:text="現在就加入"
        android:textColor="#ffffff"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent" />

    <!-- app:layout_constraintRight_toRightOf="parent" 控件自身的右邊與父控件的右邊對齊-->
    <!--  app:layout_constraintTop_toTopOf="parent" 控件自身的頂部與控件的頂部對齊-->
    <TextView
        android:id="@+id/mTxtLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_marginTop="12dp"
        android:text="登陸"
        android:textColor="@android:color/white"
        android:textSize="16sp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
           
結束
關于本文所述,也不知道對不對。如果有做得不夠好的地方,請直接指出,見笑了。