滾動條的相關顯示效果
先來看下ListView的滾動條有哪些顯示效果。
-
滾動條自身的外觀
這點不用說,就是滾動條自身的顏色,形狀等。 -
Track的外觀
默認的ListView是沒有設置Track的。為了了解Track的含義,先看一張設置了Track之后的ListView效果。這是一個紅色的Track。
可以看到在設置了Track之后在右側滾動條下面出現一個貫穿整個ListView可見區域的紅色線條。所以Track表示的是滾動條滑動時的”軌道”。 -
滾動條的大小
ListView是垂直滾動條,它的大小就是滾動條的寬度。 -
滾動條的顯示位置
滾動條出現在ListView左邊,還是右邊,以及是顯示在內側還是外側。 -
滾動條的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中有非常多的和滾動條相關的配置選項。下面具體看下每個選項的含義及配置方法。
-
android:scrollbars
此選項表示是否顯示滾動條,它的取值可以是vertical,horizontal或none。
對ListView來說,它只能垂直滾動,將scrollbars設置成horizontal或者none效果都是一樣的,也就是不會出現滾動條。所以如果不希望ListView顯示滾動條,就將scrollbars設置成none。此外,如果scrollbars設置成none,那么其他的滾動條相關的配置都不會有效果。 -
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資源后,顯示效果如圖所示。
-
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資源后,顯示效果如圖所示。
-
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的值,這里不再探究,有興趣的可以再繼續翻源碼。
-
android:verticalScrollbarPosition
此項配置用來設置滾動條的位置,它可以是right,left或者是defaultPosition。如果不設置,默認是defaultPosition。如果是defaultPosition,則滾動條的位置受到布局RTL配置的影響,如果布局是從右往左,則滾動條顯示在left側,如果布局是從左往右,則滾動條顯示在right側。
注意:滾動條沒有上下位置的設置。對於可水平滾動的View(如HorizontalScrollView),滾動條始終在下方。不能設置到上方。 -
android:scrollbarStyle
此項配置也是用來設置滾動條的位置,不過不是左右位置,而是滾動條和ListView內容之間的相對位置,它的取值范圍是insideoverlay,insideInset,outsideoverlay,outsideinset。
對一個View來說,它的內部可用區域是View自身大小再減去padding后的區域。- insideoverlay:表示滾動條右側和ListView可用區域右側對其,且覆蓋在Item之上。
- insideInset:表示滾動條右側和ListView可用區域右側對其,但不覆蓋在Item之上,而是將Item擠到滾動條的左邊。
- outsideoverlay:表示滾動條右側和ListView右側對其,且覆蓋在右側padding之上。
- outsideinset:表示滾動條右側和ListView可用區域右側對其,但不覆蓋在padding之上,而是將padding擠到滾動條的左邊。
-
android:fadeScrollbars
此項配置用來表示是否在ListView不滾動時隱藏滾動條,可以選擇true或false,默認為true,也就是不滾動時隱藏。如果將其設置為false,那么只要ListView能夠滾動,滾動條就會一直顯示,不會隱藏。但如果ListView不足一頁,不能滾動,則不會顯示。此外,如果配置了android:scrollbarTrackVertical,也就是滾動條的Track,然后設置fadeScrollbars為不隱藏滾動條,那么不僅滾動條不會隱藏,滾動條的Track同樣也不會隱藏。 -
android:scrollbarDefaultDelayBeforeFade
此項配置表示滾動條從顯示到隱藏的間隔時間,單位為毫秒,如果不設置,默認為300毫秒。例如,設置android:scrollbarDefaultDelayBeforeFade=”1200”,表示停止滾動后1.2秒后開始隱藏滾動條。需要注意的是,ListView初次加載完成時,會自動顯示出滾動條。這時如果沒有去做滑動操作,滾動條也會自動隱藏,不過和滑動后隱藏不同的是,這里需要經過4倍間隔時間后才會開始隱藏。可以在Android SDK源碼android.view.View類的initialAwakenScrollBars()方法中找到這塊代碼。 -
android:scrollbarFadeDuration
此項配置表示滾動條從滾動條開始隱藏到完全隱藏的間隔時間,單位為毫秒,如果不設置,默認為250毫秒。例如,設置android:scrollbarDefaultDelayBeforeFade=”2000”,表示開始隱藏滾動條后2秒后完全隱藏,中間是一個滾動條逐漸透明的過程。 -
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都不會隱藏。 -
android:fastScrollEnabled
此項配置表示是否啟用快速滾動條,可以選擇true或false,默認為false,也就是不使用快速滾動條。如果啟用了快速滾動條,當ListView頁數小於4頁時,仍然會顯示普通滾動條,當ListView頁數超過4頁時,才會顯示快速滾動條。前面的10項配置除了android:verticalScrollbarPosition之外,都只對普通滾動條有效果,對快速滾動條沒有影響。但android:verticalScrollbarPosition配置會影響快速滾動條,如果設置android:verticalScrollbarPosition為left,則快速滾動條也會顯示在ListView的左側。此外,當快速滾動條顯示時,普通滾動條會自動隱藏,即使普通滾動條設置為不隱藏。當快速滾動條隱藏時,普通滾動條會自動顯示,除非設置為不顯示(android:scrollbars=”none”)(從Android 5.0開始,快速滾動條隱藏時,普通滾動條不再顯示)。 -
android:fastScrollStyle
此項配置用來設置快速滾動條的樣式,其可配置的值,及含義和android:scrollbarStyle一樣。不過此項配置是從Android5.0才開始有的,所以只有Android5 .0以上的系統中,此項配置才會有效。 -
android:fastScrollAlwaysVisible
此項配置用來設置是否始終顯示快速滾動條,可以選擇true或false,默認為false,如果將其設置為true,則快速滾動條將始終顯示,不會隱藏,且不受4頁的約束,也就是說ListView即使不足4頁,快速滾動條也會顯示,甚至即使ListView不足一頁,快速滾動條都會顯示。此外,android:fadeScrollbars設置將不會生效,也就是即使android:fadeScrollbars設置為false,也不會顯示普通滾動條。 -
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圖標的。