1. 程式人生 > >android使用ViewPager實現引導頁效果

android使用ViewPager實現引導頁效果

對於大多數android開發者來說,ViewPager和ListView是再熟悉不過了,ViewPager的實現思路和ListView大同小異,具體參照前面的ListView詳解。在實現基礎的ViewPager後還加上了一個類似於Tab的效果。
下面來一一詳解:
1.在activity_main.xml中定義了ViewPager控制元件,在這之前,先匯入android的v4包。

<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=".MainActivity"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/vp" /> </RelativeLayout>

2.因為在引導頁中有一個類似與Tab的效果,於是我就在drawable下定義一個小圓點,分別是正常狀態下和選中狀態下:
新建point.xml

<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android">
    <size
        android:width="16dp"
        android:height="16dp"
        />
    <solid
android:color="#cc11e1"/>
</shape>

新建point_press.xml

<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="oval" xmlns:android="http://schemas.android.com/apk/res/android">
<size
    android:width="8dp"
    android:height="8dp"
    />
<solid android:color="#ff0000"/>
</shape>

新建一個選擇器,point_selector.xml,這裡使用的是state_enabled來判斷選擇的狀態。

<?xml version="1.0" encoding="UTF-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/point" android:state_enabled="false"/>

<item android:drawable="@drawable/point_press" android:state_enabled="true"/>

</selector>

3.在MainActivity中獲取到控制元件,準備資料來源,設定介面卡。

package com.pbq.viewpager;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;


public class MainActivity extends Activity {

            private ViewPager viewPager;
            MyViewPager myViewPager;
            private int images[]={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};
            private int points[]={R.drawable.point,R.drawable.point,R.drawable.point,R.drawable.point};
            private String texts[]={"第一頁","第二頁","第三頁","第四頁"};
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                viewPager= (ViewPager) findViewById(R.id.vp);
                //設定介面卡
                myViewPager=new MyViewPager(this,images,points,texts);
                viewPager.setAdapter(myViewPager);

                //設定中間位置
//                int item = Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2%images.length;//要保證imageViews的整數倍
//                viewPager.setCurrentItem(item);

                viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    /**
                     * 當頁面滾動了的時候回撥這個方法
                     * @param position 當前頁面的位置
                     * @param positionOffset 滑動頁面的百分比
                     * @param positionOffsetPixels 在螢幕上滑動的像數
                     */
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            /**
             * 當某個頁面被選中了的時候回撥
             * @param position 被選中頁面的位置
             */
            @Override
            public void onPageSelected(int position) {
                myViewPager.setPointState(position);
            }

            /**
             * 當頁面滾動狀態變化的時候回撥這個方法
             *@param i 靜止->滑動
             *滑動-->靜止
             *靜止-->拖拽
             */
            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
    }
}

4.新建介面卡MyViewPager,這裡從MainActivity中會傳入一個構造器,第一個引數為上下文,第二個引數為圖片的資源陣列,第三個引數為小圓點的圖片資源陣列,第四個引數為顯示的文字資源。這是MyViewPager繼承PagerAdapter這個抽象類,實現getCount(獲取總數),isViewFromObject(比較View和Object是否為同一例項),instantiateItem(相當於getView),destroyItem(釋放資源)這4個方法,最主要的當然是instantiateItem的具體實現,要想講圖片文字和小圓點顯示在檢視上,此時我們需要一個行佈局,把他通過instantiateItem載入到檢視上。
新建item.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">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/a"
        android:scaleType="fitXY"
        />
    <LinearLayout
        android:orientation="vertical"
        android:gravity="center"
        android:layout_alignBottom="@id/iv"
        android:layout_width="match_parent"
        android:layout_height="80dp">
        <TextView
            android:id="@+id/tv"
            android:textColor="#000"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第一頁"
            />
        <LinearLayout
            android:layout_marginTop="10dp"
            android:id="@+id/ll"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

細心的朋友可以看到這裡在textView的下面怎麼有一個空的LinearLayout,這是用來顯示小圓點的,為什麼不在行佈局中顯示呢?之前我也是在這裡顯示,但發現一個小問題,當我寫了4個小圓點定義好之後,顯示確實好看,但如果我的圖片資源不止4個呢?我還要自己手動去來行佈局中進行修改,於是靈光一現,我是不是可以在程式碼中動態新增呢?看看程式碼,是不是比先前更智慧了呢?這裡設定了預設顯示第一頁選中。

linearLayout= (LinearLayout) view.findViewById(R.id.ll);
        for (int i = 0 ;i < images.length;i++) {
            //新增點
            ImageView point = new ImageView(context);
            point.setBackgroundResource(R.drawable.point_selector);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(16,16);
            if (i == 0) {
                //預設顯示第一頁選中
                point.setEnabled(true); //顯示紅色
            } else {
                point.setEnabled(false);//顯示紫色
                params.leftMargin = 16;
            }
            point.setLayoutParams(params);
            linearLayout.addView(point);
        }

這時,心想終於完成了,執行程式碼一看,為什麼滑動到第二頁之後小圓點沒有移動呢?
這裡寫圖片描述
呵呵,原來還沒對viewpager的頁面進行監聽

 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    /**
                     * 當頁面滾動了的時候回撥這個方法
                     * @param position 當前頁面的位置
                     * @param positionOffset 滑動頁面的百分比
                     * @param positionOffsetPixels 在螢幕上滑動的像數
                     */
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            /**
             * 當某個頁面被選中了的時候回撥
             * @param position 被選中頁面的位置
             */
            @Override
            public void onPageSelected(int position) {
                myViewPager.setPointState(position);
            }

            /**
             * 當頁面滾動狀態變化的時候回撥這個方法
             *@param i 靜止->滑動
             *滑動-->靜止
             *靜止-->拖拽
             */
            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

當頁面被選中的時候通過adapter去呼叫myViewPager.setPointState(position);這個方法。來到MyViewPager中。

   /**
     * 設定點滑動的狀態
     * @param position
     */
    public void setPointState(int position) {
        //支援無限滑動
//        int realPosition = position%images.length;

        //把上一個高亮的設定預設-紫色
        linearLayout.getChildAt(prePosition).setEnabled(false);
        //當前的設定為高亮-紅色

        linearLayout.getChildAt(position).setEnabled(true);
    }

好了,看一下效果。這是在第二個頁面小圓點也移動了。
這裡寫圖片描述

相關推薦

android使用ViewPager實現引導效果

對於大多數android開發者來說,ViewPager和ListView是再熟悉不過了,ViewPager的實現思路和ListView大同小異,具體參照前面的ListView詳解。在實現基礎的ViewPager後還加上了一個類似於Tab的效果。 下面來一一詳解

動態計算在指定位置新增view,實現引導效果

方式一:Popupwindow private void showGuideWindowPop() { if (mGuideWindow == null) { mGuideView = (RelativeLayout) LayoutInflater.f

IOS——使用ScrollView和PageController實現引導效果

如標題所說,使用的是ScrollView和PageControlle兩個控制元件共同達到該效果 首先,使用storyboard將ScrollView和PageControlle拖入,要注意的是,PageControl不能被ScrollView包含在內,二者要分開屬於平級關係

Hander實現引導

pty activit message ssa handle ont 設置 content int 使用Hander實現引導頁: 代碼: /** * 引導頁 */ public class SplashActivity extends Activity {

Flask快速實現效果

先上整體效果圖: 然後是分頁圖詳情: 與本例相關的路由和模板包括: 路由:views.py @app.route('/blog/list/<int:page>', methods=['GET']) @login_required def blog_

vue+elementui實現效果

當我們向後臺請求大量資料的時候,並要在頁面展示出來,請求的資料可能上百條資料或者更多的時候,並不想在一個頁面展示,這就需要使用分頁功能來去完成了。 1.本次所使用的是vue2.0+element-ui實現一個分頁功能,element-ui這個元件特別豐富,分頁中給我提供了一個Pagination

原生javascript實現效果+搜尋功能

一、概述 首先,我們要明確為何需要分頁技術,主要原因有以下:   1、分頁可以提高客戶體驗度,適當地選擇合適的資料條數,讓頁面顯得更有條理,使得使用者體驗感良好,避免過多資料的冗餘。   2、提高效能的需要。 為何需要搜尋技術,主要原因有以下: 1、搜尋功能,能準確的根據使用

ViewPager實現引導,底部圓點跟隨移動

public class GuideActivity extends Activity { private ViewPager mViewPager; private int[] mGuideLists; private Button mButton; p

使用laravel 實現效果 超簡單

每頁展示5條資料 控制器 class indexCo extends Controller { public function cc () { $lists = UserAli:

mybatis中oracle實現效果

首先當我們需要通過xml格式處理sql語句時,經常會用到< ,<=,>,>=等符號,但是很容易引起xml格式的錯誤,這樣會導致後臺將xml字串轉換為xml文件時報錯,從而導致程式錯誤。   這樣的問題在iBatiS中或者自定義的xml處理sql的程式中經常需要我

jq前端實現效果小外掛

最近實現了一個分頁的jq外掛分享出來。一、需求  後端資料一股腦拋過來,列表形式顯示內容,由於資料量龐大,就考慮分頁實現了。本外掛宣告(未考慮效能問題,只是實現了相應功能)。二、選擇  外掛開發最快速方法莫過於jquery的外掛開發功能三、外掛原始碼奉上(function($

微信H5使用resLoader實現載入效果

前言 最近為所服務機構寫了一個H5,名字和展現內容並不重要,就不贅述,鏗鏘鏗鏘一大頓,寫完了。效果不錯,符合主流手機瀏覽器,資源為3.49mb,不多不少,網速也都夠。領導拍拍腦袋,改改這裡,修修那裡,匆匆忙忙,就上線了,完美與殘缺總在一念之間。 一、微信

水平recyclerview實現效果

前言:recyclerview 是一個非常強大的佈局檔案,擴充套件性極強。因此用它實現翻頁效果,效果會非常棒。本文只是實現翻頁,至於動畫和方向自行擴充套件。 方法:如果不熟悉recyclerview使用,可參考鴻陽大神的文章 1.翻頁的方向,預設向右或者

利用swiper實現tab效果

<!DOCTYPE html> <html lang="en" style="font-size: 54.9333333333333px;"> <head> <meta charset="UTF-8"> <

AJAX實現效果

歡迎使用Markdown編輯器寫部落格 本Markdown編輯器使用StackEdit修改而來,用它寫部落格,將會帶來全新的體驗哦: Markdown和擴充套件Markdown簡潔的語法 程式碼塊高亮 圖片連結和圖片上傳 LaTex數學公式 UML序列

c#在winform中用DataGridView實現效果

public partial class Form11 : Form     {         public Form11()         {             InitializeComponent();         }         priv

viewpager實現效果(fragment)

viewpager的運用核心在於介面卡的編寫,及最終的setadapter(adapter) 谷歌官方認為,ViewPager應該和Fragment一起使用時,此時ViewPager的介面卡是FragmentPagerAdapter,當你實現一個Fragmen

【git】--------------vue+element-ui實現效果-------------【劉】

管理 nta git nat 。。 layout item spa style 當從後臺請求到大量數據的時候,並要在頁面展示出來,請求的數據可能上百條數據或者更多的時候,並不想在一個頁面展示,這就需要使用分頁功能來去完成了。 1.這次使用的是vue2.0+element-

Java實現效果

步驟 1.使用者發出請求,傳遞條件 2.SpringMVC獲取條件,資料庫查詢,傳回結果 3.ajax得到資料進行處理,最終呈現 HTML設計 <!---分頁查詢--> <div class="ta

Android使用ViewPager實現引導(帶小點提示)

介紹        ViewPager是一種允許使用者左右滑動頁面的佈局管理器,你需要寫一個類繼承PageAdapter來生成要展示的介面。 實現 一、 在佈局檔案中新增控制元件 <android.support.v4.view.ViewPager