Android ListView滾動條配置完全解析


滾動條的相關顯示效果

先來看下ListView的滾動條有哪些顯示效果。

  1. 滾動條自身的外觀 
    這點不用說,就是滾動條自身的顏色,形狀等。

  2. Track的外觀 
    默認的ListView是沒有設置Track的。為了了解Track的含義,先看一張設置了Track之后的ListView效果。這是一個紅色的Track。 
    這里寫圖片描述 
    可以看到在設置了Track之后在右側滾動條下面出現一個貫穿整個ListView可見區域的紅色線條。所以Track表示的是滾動條滑動時的”軌道”。

  3. 滾動條的大小 
    ListView是垂直滾動條,它的大小就是滾動條的寬度。

  4. 滾動條的顯示位置 
    滾動條出現在ListView左邊,還是右邊,以及是顯示在內側還是外側。

  5. 滾動條的Fade時間 
    滾動條只有在滾動的時候才會顯示,當停止滾動后,滾動條會在一段時間后漸漸消失。這里有兩個時間點,一個是從停止滾動到開始消失的時間,一個是開始消失到完全消失的時間。

在XML中自定義ListView滾動條

自定義ListView滾動條可以直接在布局文件中對ListView進行配置。 
先看下ListView在XML中有哪些和滾動條相關的配置選項。 
android:scrollbars 
android:scrollbarThumbVertical 
android:scrollbarTrackVertical 
android:scrollbarSize 
android:verticalScrollbarPosition 
android:scrollbarStyle 
android:fadeScrollbars 
android:scrollbarDefaultDelayBeforeFade 
android:scrollbarFadeDuration 
android:scrollbarAlwaysDrawVerticalTrack 
android:fastScrollEnabled 
android:fastScrollStyle 
android:fastScrollAlwaysVisible 
可以看到ListView中有非常多的和滾動條相關的配置選項。下面具體看下每個選項的含義及配置方法。

  1. android:scrollbars 
    此選項表示是否顯示滾動條,它的取值可以是vertical,horizontal或none。 
    對ListView來說,它只能垂直滾動,將scrollbars設置成horizontal或者none效果都是一樣的,也就是不會出現滾動條。所以如果不希望ListView顯示滾動條,就將scrollbars設置成none。此外,如果scrollbars設置成none,那么其他的滾動條相關的配置都不會有效果。

  2. android:scrollbarThumbVertical 
    此選項用來控制垂直滾動條的顯示外觀,這也是美化滾動條時最重要的一項配置。它可以設置為一個顏色值,或者是一個Drawable資源。對Drawable資源可以使用.9的png圖片,也可以使用XML來配置。 
    例如下面這個xml就定義了一個Drawable資源,其內部是一個從綠色到紅色的漸變色,四角有6dp的圓角,同時還有一個1dp的帶有透明度的黑色邊框。

    <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:angle="0" android:endColor="#FF0000" android:startColor="#00FF00" /> <corners android:radius="6dp" /> <stroke android:width="1dp" android:color="#A4000000" /> </shape>

    將scrollbarThumbVertical設置為該Drawable資源后,顯示效果如圖所示。 
    這里寫圖片描述

  3. android:scrollbarTrackVertical 
    此選項用來控制垂直滾動條背后滑動軌道的顯示效果。和android:scrollbarThumbVertical配置一樣,android:scrollbarTrackVertical可以設置為一個顏色值,或者是一個Drawable資源。 
    例如下面的xml,內部是一個#F1F0C1顏色的實心矩形,四角有6dp的圓角,同時還有一個1dp的帶有透明度的黑色邊框。

    <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#F1F0C1" /> <corners android:radius="6dp" /> <stroke android:width="1dp" android:color="#A2000000" /> </shape>

    將scrollbarTrackVertical設置為該Drawable資源后,顯示效果如圖所示。 
    這里寫圖片描述

  4. android:scrollbarSize 
    此選項表示滾動條的大小,對ListView來說就是滾動條的寬度。 
    例如設置android:scrollbarSize=”3dp”,表示滾動條寬度為3dp。顯示效果如圖所示。 
    這里寫圖片描述 
    關於此項配置需要注意的是,如果android:scrollbarThumbVertical配置的是一個.9.png的圖片(自身有寬度的Drawable),那么android:scrollbarSize配置會被忽略,只有android:scrollbarThumbVertica配置的是顏色值或者xml時(自身寬度為0的Drawable),此項配置才會有效。下面看下Android SDK的源碼。 
    android.view.View類getVerticalScrollbarWidth()方法源碼如下。

    public int getVerticalScrollbarWidth() { ScrollabilityCache cache = mScrollCache; if (cache != null) { ScrollBarDrawable scrollBar = cache.scrollBar; if (scrollBar != null) { int size = scrollBar.getSize(true); if (size <= 0) { size = cache.scrollBarSize; } return size; } return 0; } return 0; }

    mScrollCache.scrollBarSize就是這里配置的滾動條寬度。scrollBar是ScrollBarDrawable類的對象,其getSize()方法源碼如下。

    public int getSize(boolean vertical) { if (vertical) { return mVerticalTrack != null ? mVerticalTrack.getIntrinsicWidth() : mVerticalThumb != null ? mVerticalThumb.getIntrinsicWidth() : 0; } else { return mHorizontalTrack != null ? mHorizontalTrack.getIntrinsicHeight() : mHorizontalThumb != null ? mHorizontalThumb.getIntrinsicHeight() : 0; } } 

    mVerticalTrack,mVerticalThumb 就是android:scrollbarThumbVertical和android:scrollbarTrackVertical配置的Drawable對象,從這里可以看到,只有android:scrollbarThumbVertical配置的Drawable對象的getIntrinsicWidth()方法返回的是小於等於0的值,才會使用mScrollCache.scrollBarSize作為滾動條的寬度。關於Drawable對象的getIntrinsicWidth()方法何時返回大於0的值,何時返回小於等於0的值,這里不再探究,有興趣的可以再繼續翻源碼。

  5. android:verticalScrollbarPosition 
    此項配置用來設置滾動條的位置,它可以是right,left或者是defaultPosition。如果不設置,默認是defaultPosition。如果是defaultPosition,則滾動條的位置受到布局RTL配置的影響,如果布局是從右往左,則滾動條顯示在left側,如果布局是從左往右,則滾動條顯示在right側。 
    注意:滾動條沒有上下位置的設置。對於可水平滾動的View(如HorizontalScrollView),滾動條始終在下方。不能設置到上方。

  6. android:scrollbarStyle 
    此項配置也是用來設置滾動條的位置,不過不是左右位置,而是滾動條和ListView內容之間的相對位置,它的取值范圍是insideoverlay,insideInset,outsideoverlay,outsideinset。 
    對一個View來說,它的內部可用區域是View自身大小再減去padding后的區域。

    • insideoverlay:表示滾動條右側和ListView可用區域右側對其,且覆蓋在Item之上。
    • insideInset:表示滾動條右側和ListView可用區域右側對其,但不覆蓋在Item之上,而是將Item擠到滾動條的左邊。
    • outsideoverlay:表示滾動條右側和ListView右側對其,且覆蓋在右側padding之上。
    • outsideinset:表示滾動條右側和ListView可用區域右側對其,但不覆蓋在padding之上,而是將padding擠到滾動條的左邊。 
      這里寫圖片描述
  7. android:fadeScrollbars 
    此項配置用來表示是否在ListView不滾動時隱藏滾動條,可以選擇true或false,默認為true,也就是不滾動時隱藏。如果將其設置為false,那么只要ListView能夠滾動,滾動條就會一直顯示,不會隱藏。但如果ListView不足一頁,不能滾動,則不會顯示。此外,如果配置了android:scrollbarTrackVertical,也就是滾動條的Track,然后設置fadeScrollbars為不隱藏滾動條,那么不僅滾動條不會隱藏,滾動條的Track同樣也不會隱藏。

  8. android:scrollbarDefaultDelayBeforeFade 
    此項配置表示滾動條從顯示到隱藏的間隔時間,單位為毫秒,如果不設置,默認為300毫秒。例如,設置android:scrollbarDefaultDelayBeforeFade=”1200”,表示停止滾動后1.2秒后開始隱藏滾動條。需要注意的是,ListView初次加載完成時,會自動顯示出滾動條。這時如果沒有去做滑動操作,滾動條也會自動隱藏,不過和滑動后隱藏不同的是,這里需要經過4倍間隔時間后才會開始隱藏。可以在Android SDK源碼android.view.View類的initialAwakenScrollBars()方法中找到這塊代碼。

  9. android:scrollbarFadeDuration 
    此項配置表示滾動條從滾動條開始隱藏到完全隱藏的間隔時間,單位為毫秒,如果不設置,默認為250毫秒。例如,設置android:scrollbarDefaultDelayBeforeFade=”2000”,表示開始隱藏滾動條后2秒后完全隱藏,中間是一個滾動條逐漸透明的過程。

  10. android:scrollbarAlwaysDrawVerticalTrack 
    此項配置表示是否總是顯示垂直滾動條的Track,可以選擇true或false,默認為false。通常,如果設置了滾動條的Track,那么Track會隨着滾動條一起顯示和隱藏。但如果設置了android:scrollbarAlwaysDrawVerticalTrack為true,則滾動條的Track將一直顯示,不會隱藏。當然,如果沒有配置android:scrollbarTrackVertical,即使設置了android:scrollbarAlwaysDrawVerticalTrack為true,也不會有Track顯示。此外,android:fadeScrollbars配置為false,則無論android:scrollbarAlwaysDrawVerticalTrack配置為true還是false,Track都不會隱藏。

  11. android:fastScrollEnabled 
    此項配置表示是否啟用快速滾動條,可以選擇true或false,默認為false,也就是不使用快速滾動條。如果啟用了快速滾動條,當ListView頁數小於4頁時,仍然會顯示普通滾動條,當ListView頁數超過4頁時,才會顯示快速滾動條。前面的10項配置除了android:verticalScrollbarPosition之外,都只對普通滾動條有效果,對快速滾動條沒有影響。但android:verticalScrollbarPosition配置會影響快速滾動條,如果設置android:verticalScrollbarPosition為left,則快速滾動條也會顯示在ListView的左側。此外,當快速滾動條顯示時,普通滾動條會自動隱藏,即使普通滾動條設置為不隱藏。當快速滾動條隱藏時,普通滾動條會自動顯示,除非設置為不顯示(android:scrollbars=”none”)(從Android 5.0開始,快速滾動條隱藏時,普通滾動條不再顯示)。

  12. android:fastScrollStyle 
    此項配置用來設置快速滾動條的樣式,其可配置的值,及含義和android:scrollbarStyle一樣。不過此項配置是從Android5.0才開始有的,所以只有Android5 .0以上的系統中,此項配置才會有效。

  13. android:fastScrollAlwaysVisible 
    此項配置用來設置是否始終顯示快速滾動條,可以選擇true或false,默認為false,如果將其設置為true,則快速滾動條將始終顯示,不會隱藏,且不受4頁的約束,也就是說ListView即使不足4頁,快速滾動條也會顯示,甚至即使ListView不足一頁,快速滾動條都會顯示。此外,android:fadeScrollbars設置將不會生效,也就是即使android:fadeScrollbars設置為false,也不會顯示普通滾動條。

  14. fastScroll的其他配置 
    當啟用了快速滾動條后,在布局文件中只提供了快速滾動條樣式和是否始終可見的設置。並沒有像普通滾動條一樣的可以用自定義的Drawable來替代默認的圖標的配置選項,也沒有提供對Track的配置。要想修改快速滾動條的圖標和Track,可以在ListView所在的Activity的theme中來配置(如果Activity沒有配置Theme,則在Application的theme中配置)。theme中支持的配置項有

    • android:fastScrollThumbDrawable
    • android:fastScrollOverlayPosition
    • android:fastScrollTextColor
    • android:fastScrollTrackDrawable
    • android:fastScrollPreviewBackgroundLeft
    • android:fastScrollPreviewBackgroundRight

這些配置項都是從API 11,也就是Android 3.0開始支持的。其中fastScrollThumbDrawable和fastScrollTrackDrawable就是用來配置快速滾動條的圖標及Track圖標的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM