seekbar的尺寸定义精要
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来设置滑块,效果美美哒喵