seekbar背景的定制是一件麻煩的事情,而且最好是用shapedrawable去定制(這樣可以任意拉伸),如果直接用圖片,則注意的事項就會很多了,否則一般情況下總會有各種不如意。最近做UI遇到了seekbar必須用到圖片去填充的情況,定義尺寸的時候費了很多勁。效果如下圖:
明顯是一個背景圖和thumb,沒有progress,而且配上屏幕適配 的問題,費了很大勁。
順便提及,其實很多情況下,例如button、seekbar、imagebutton、imageview等等wrap_content設置background的時候,圖像出現意外拉伸或縮小,其實是由於圖像在drawable的目錄不對引起的(而不是設置minheight和minwidth的問題,設置這個確實能解決問題,但是圖像可能會因為拉伸變得模糊,因為並不是這個引起的,根本原因要清楚),筆者此項目是在屏幕密度為160dpi的車機上運行的,對應的drawable應放置在mdpi的文件夾下,一開始時候我是放在hdpi(240dpi)文件夾下的,背景顯示在車機上,總會縮小1/3,因為android加載圖片時候,已經根據目錄幫你算好了在屏幕上應該顯示多少dp,例如在hpi文件夾下的100px的圖片,android會認為你是在240dpi的屏幕上運行,要顯示出100px,應該是66.7dp的長度,這時你如果在160dpi的設備商運行,顯示效果還是66.7dp的效果,即66.7px
我最終的布局參數是:
<SeekBar android:id="@+id/splash" android:layout_width="wrap_content" android:layout_height="wrap_content" android:minHeight="145dp" android:maxHeight="145dp" android:maxWidth="482dp" android:minWidth="482dp" android:progressDrawable="@drawable/radio_dash" android:thumb="@drawable/radio_dash_drag" android:progress="20" android:max="100" android:paddingLeft="1dp" android:paddingRight="1dp" android:thumbOffset="1dp" />
其中,minwidth和minheight等四個屬性只對progressDrawable里邊的內容有效,我們可以用這四個屬性固定住背景和進度條,layout_width和height如果也設置為固定值,則如果滑塊比背景大,多余的部分就不會顯示。而thumboffset是滑塊相對於背景的起始部分,設置為0則滑塊的左邊緣會與背景的左邊緣對齊,設置為正值則會expand背景,這時需要設置padding讓expand出背景的滑塊顯示出來,達到滑塊的中心跟背景的起點對齊的效果。
綜上所述,就是利用minwidth和minheight來固定progressDrawable,用thumboffset和padding來設置滑塊,效果美美噠喵