亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android客戶端實現圖片輪播控件

2019-12-12 06:41:43
字體:
來源:轉載
供稿:網友

本文和大家一起寫一個Android圖片輪播控件,供大家參考,具體內容如下

1. 輪播控件的組成部分

    我們以知乎日報Android客戶端的輪播控件為例,分析一下輪播控件的主要組成:   

    首先我們要有用來顯示圖片的View對象,根據上圖中底部中央的5個點,我們知道需要5個ImageView來顯示需要輪播的圖片,另外還需要5個ImageView來顯示5個點?,F在考慮以下輪播組件應該具有的行為,首先需要每隔一定時間間隔切換到下一張圖片,并且圖片間切換的效果應該是平滑的,就像“翻書”一樣。由此我們可以想到將5個圖片當做ViewPager的Page,這樣圖片切換時自然會有平滑的效果。接下來,我們還要給底部的5個小點找一個父容器,由于它們是線性排列的,所以用LinearLayout是再合適不過了。然后,我們還要把ViewPager和容納5個點的LinearLayout放入一個父容器中,這里我們選擇使用垂直排列子View的LinearLayout。

    這樣一來,我們就得到了輪播控件的布局文件(carousel_layout.xml):

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:layout_width="match_parent"       android:layout_height="match_parent"       android:orientation="vertical">  <android.support.v4.view.ViewPager    android:id="@+id/view_pager"    android:layout_width="match_parent"    android:layout_height="match_parent" />  <LinearLayout    android:id="@+id/dots"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_gravity="bottom"    android:gravity="center"    android:orientation="horizontal"    android:padding="8dp" >  </LinearLayout>  </LinearLayout>

    通過對輪播控件的組成部分進行分析,我們已經確定了用什么“數據結構”來表示一個輪播組件,那么接下來,我們要做的就是實現輪播組件的”算法“,也就是業務邏輯。

2. 輪播組件的行為分析

    輪播控件首先要具有的行為是自動播放,也就是每隔一定事件間隔(通常是3到5秒),便自動”翻到下一頁“。為了實現這一點,我們可以維護一個currentItem變量來記錄當前正在顯示的圖片,然后設置一個定時任務,調用ViewPager的setCurrentItem方法設置當前要顯示的圖片,并將currentItem設為下一張要顯示的圖片。有一點需要我們注意的便是播放到最后一張圖片時,下一個被顯示的應該是第一個圖片,而且切換的效果也不再是平滑的。

    輪播控件的還要能響應我們的滑動動作,也就是我們能夠通過左右滑動來在不同的圖片之間切換,這個行為ViewPager自動為我們提供了。另外還有一個輪播控件應該具備的行為是:當切換到指定圖片時,相應的圓點應該以區別其他4個圓點的顏色顯示,以便用戶能夠知道當前正在播放的是第幾個圖片。要實現這一點也不復雜,只需要為ViewPager添加一個OnPageChangeListener監聽器,然后重寫相應的回調方法即可,這樣當用戶選定了某個Page時,onPageSelected方法會被回調,系統會傳入當前Page的索引,我們便可以根據這個索引設置相應的圓點顏色。

 3. 輪播控件的具體實現

    經過以上的分析,我們已經清楚的了解了輪播組件的表示及業務邏輯,接下來只要我們用Java把這些描述出來就大功告成了。

(1)定時任務
    我們需要定時執行“改變ViewPager當前Page為下一個Page”這一任務,這里我們采用Handler來實現,代碼如下:

mHandler.postDelayed(task, DELAY);  private final Runnable task = new Runnable() {    @Override    public void run() {      if (isAutoPlay) {        currentItem = (currentItem + 1) % (mTopStories.size());        mVP.setCurrentItem(currentItem);        mHandler.postDelayed(task, DELAY);      } else {        mHandler.postDelayed(task, DELAY);      }    }  };

    在以上代碼中,DELAY代表我們設置的一個延遲常量(單位ms)。由于我們需要的是循環播放,因此第5張顯示完畢后應該顯示第一張,所以我們要想第6行那樣進行一個模運算,這樣currentItem就在0到4之間不停變化了。注意第5行有一個isAutoPlay變量,這個變量表示當前是否應該自動播放。那么什么時候不應該自動播放呢?我們知道當我們滑動手指切換圖片時,圖片會“跟隨”著我們的手,就好比我們翻書頁的時候,只有松開了手書頁才能落下。所以我們正在“拖動”圖片時,也就是我們的手還沒松開時,輪播控件是不應該自動播放的。為了實現這一點,我們只需重寫OnPageChangeListener中的onPageScrollStateChanged方法,在當前狀態為“拖動”時設置isAutoPlay變量為false。從第10行我們可以知道,當autoPlay為false時,不會改變當前顯示的圖片,僅僅會等過了DELAY指定的時間后再執行下一次定時任務。 

(2)OnPageChangeListener
    上面我們提到了要給ViewPager添加一個OnPageChangeListener監聽器對象,來實現小圓點顏色的改變以及autoPlay變量的賦值。具體的實現請看以下代碼,代碼的含義都很直接:

class TopOnPageChangeListener implements ViewPager.OnPageChangeListener {    @Override    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }    @Override    public void onPageSelected(int position) {      for (int i = 0; i < mDotsIV.size(); i++) {        if (i == position) {          mDotsIV.get(i).setImageResource(R.drawable.dot_focus);        } else {          mDotsIV.get(i).setImageResource(R.drawable.dot_blur);        }      }    }    @Override    public void onPageScrollStateChanged(int state) {      switch (state) {        //SCROLL_STATE_DRAGGING        case 1:          isAutoPlay = false;          break;        //SCROLL_STATE_SETTLING        case 2:          isAutoPlay = true;          break;        default:          break;      }    }  }

    在以上代碼的第10到16行,我們重寫了onPageSelected方法,position參數表示當前Page的索引。這個方法中,我們設置當前圖片對應的圓點圖片為dot_focus,設置其他圓點的圖片為dot_blur,這樣用戶就能知道當前的位置。在第21行到32行,我們重寫了onPageScrollStateChanged方法,state參數代表了當前的“滾動狀態,這個值為1表示當前用戶正在”拖動“的過程中,因此要設置isAutoPlay為false;這個值為2表示用戶松開了手,圖片正在”滾動“中,這時我們就要把isAutoPlay設回默認值true,恢復自動播放。

 (3) 更進一步
    有時候我們希望能夠從最后一頁直接“翻到”第一頁,而這種行為默認不被PagerView所支持,要想實現這個行為,我們可以在PagerView中增加一些“輔助頁”,并重寫OnPageChangeLisener中的相關方法。然而我們在很多場景中只需要保持PagerView的默認行為就好,要注意增加任何功能都要考慮應用場景,避免畫蛇添足。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丰满岳妇乱一区二区三区| 亚洲人成欧美中文字幕| 性色av香蕉一区二区| 成人国产精品日本在线| 亚洲色图35p| 国内精品免费午夜毛片| 亚洲天堂男人的天堂| 97碰在线观看| 日韩在线观看免费| 欧美大片免费观看在线观看网站推荐| 国产一区二区丝袜| 国产91精品久久久久久久| 国精产品一区一区三区有限在线| 国产成人精品最新| 日韩精品在线视频美女| 米奇精品一区二区三区在线观看| 啪一啪鲁一鲁2019在线视频| 亚洲精品久久久久久久久久久久久| 日韩欧美综合在线视频| 国内精品视频一区| 久久成人国产精品| 欧美午夜精品久久久久久浪潮| 欧美老肥婆性猛交视频| 久久国产精品影视| 欧美激情久久久久久| 午夜精品一区二区三区在线视| 亚洲人成欧美中文字幕| 美乳少妇欧美精品| 亚洲日本中文字幕| 精品国产一区二区三区在线观看| 亚洲国产天堂久久国产91| 亚洲男人天堂手机在线| 国产一区二区动漫| 亚洲精品成人免费| 久久艹在线视频| 日韩免费观看网站| 美女国内精品自产拍在线播放| 最近2019年日本中文免费字幕| 国产精品日韩在线观看| 色av中文字幕一区| 这里只有精品久久| 日韩在线观看网站| 91精品国产沙发| 日韩亚洲国产中文字幕| 亚洲国产成人精品久久久国产成人一区| 亚洲三级黄色在线观看| 日韩国产在线播放| 日韩欧美一区二区在线| 久久国产精品99国产精| 久久国产加勒比精品无码| 亚洲xxxx18| 日韩欧美国产骚| 久久久精品影院| 俺去亚洲欧洲欧美日韩| 国产欧美日韩中文| 成人精品一区二区三区电影免费| 日韩精品在线视频观看| 色天天综合狠狠色| 九九热r在线视频精品| 久久精品国产综合| 日韩免费视频在线观看| 亚州精品天堂中文字幕| 欧美猛交免费看| 欧美黑人一级爽快片淫片高清| 亚洲一区中文字幕| 久久精品国产一区| 欧美亚洲第一区| 久久精视频免费在线久久完整在线看| 欧美裸体xxxx极品少妇软件| 亚洲最新在线视频| 91在线国产电影| 久久精品一本久久99精品| 91亚洲va在线va天堂va国| 国产成人精品综合| 久久色免费在线视频| 日本成人黄色片| zzjj国产精品一区二区| 久久久久久久久久久免费精品| 成人国产在线视频| 亚洲女在线观看| 久久99久久99精品中文字幕| 久久精品2019中文字幕| 日韩av大片免费看| 欧美激情第1页| 一本色道久久综合狠狠躁篇的优点| 久久青草福利网站| 国产欧美日韩亚洲精品| 在线看国产精品| 中文字幕精品网| 亚洲天堂影视av| 国产v综合v亚洲欧美久久| 日韩亚洲国产中文字幕| 91在线免费看网站| 韩日精品中文字幕| 性欧美暴力猛交69hd| 日韩精品欧美国产精品忘忧草| 亚洲视频一区二区| 国产69久久精品成人看| 欧美精品久久久久久久免费观看| 亚洲女人初尝黑人巨大| 精品久久国产精品| 91亚洲午夜在线| 97在线视频免费观看| 亚洲精品一区在线观看香蕉| 亚洲精品乱码久久久久久金桔影视| 91精品国产91久久久久久最新| 久久精品中文字幕电影| 亚洲乱码国产乱码精品精| 91久久综合亚洲鲁鲁五月天| 色香阁99久久精品久久久| 欧美色播在线播放| 日韩美女福利视频| 国产精品露脸av在线| 日韩激情av在线免费观看| 亚洲欧美日韩精品久久奇米色影视| 91久久夜色精品国产网站| 欧美精品第一页在线播放| 成人激情视频在线播放| 国产女精品视频网站免费| 亚洲第一精品夜夜躁人人躁| 高清日韩电视剧大全免费播放在线观看| 亚洲国产成人精品久久久国产成人一区| 国产伦精品免费视频| 亚洲欧美福利视频| 成人444kkkk在线观看| 欧美交受高潮1| 国产精品国产三级国产aⅴ浪潮| 国产精品视频一区二区三区四| 亚洲欧美日韩高清| 亚洲欧美福利视频| 色综合天天综合网国产成人网| 日本国产欧美一区二区三区| 亚洲欧美一区二区三区四区| 91在线免费视频| 国外成人在线视频| 国产在线播放91| 国产精品v日韩精品| 日韩视频精品在线| 91久久久久久久久久| 亚洲第一男人天堂| 国产欧美日韩专区发布| 国产精品亚洲激情| 亚洲女人天堂av| 亚洲美腿欧美激情另类| 日韩欧美极品在线观看| 在线播放国产一区二区三区| 欧美专区在线视频| 欧美性色xo影院| 国产在线观看精品| 欧美尺度大的性做爰视频| 亚洲人成网站999久久久综合| 亚洲欧洲午夜一线一品| 国产精品久久久久久久久男| 国产精品黄色影片导航在线观看| 久久成人精品视频| 国产精品中文字幕久久久| 国产精品亚洲激情| 国产精品日韩欧美综合| 国产亚洲精品美女| 韩国福利视频一区| 欧美第一页在线| 红桃视频成人在线观看| 亚洲午夜国产成人av电影男同| 精品免费在线观看|