AppCompatSeekBar的progressDrawable在部分平板设备中偏移问题求助
我之前也碰到过类似的情况——用9-patch做SeekBar的进度轨道,在手机上显示正常,但大尺寸平板上出现了轨道偏移的问题。结合你的代码,我整理了几个可能的原因和对应的解决方案:
1. 检查9-patch图片的拉伸/内容区域设置
平板的屏幕尺寸、dpi和手机差异较大,如果9-patch的拉伸规则没做好,很容易导致轨道错位:
- 打开
icon_track和seek_track_selected这两张9-patch图,确认:- 左侧和顶部的黑线是拉伸区域,要确保它们只覆盖轨道需要横向拉伸的部分,不要包含上下多余的空白区域
- 右侧和底部的黑线是内容显示区域,需要和轨道的实际可显示范围精准匹配,避免系统自动调整位置时出错
- 如果拉伸区域设置过宽或者内容区域标记不准确,平板上的拉伸逻辑就会出现偏移,重新调整9-patch的标记后再测试。
2. 给layer-list的item添加gravity和尺寸约束
你的seekbar_track_progress_notifier.xml里的layer-list没有设置gravity,系统可能会在大尺寸屏幕上自动调整轨道位置,导致偏移。修改成这样试试:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background" android:drawable="@drawable/icon_track" android:gravity="center_vertical" android:height="wrap_content" /> <item android:id="@android:id/progress"> <scale android:drawable="@drawable/seek_track_selected" android:scaleWidth="100%" android:gravity="center_vertical" /> </item> </layer-list>
添加android:gravity="center_vertical"强制轨道垂直居中,同时给background项设置android:height="wrap_content",避免系统过度拉伸轨道高度。
3. 固定SeekBar的高度范围
平板上的SeekBar默认可能会有不同的内部padding,导致轨道偏移。在布局里给AppCompatSeekBar添加android:minHeight和android:maxHeight,固定它的高度和轨道图片的实际高度一致:
<android.support.v7.widget.AppCompatSeekBar android:id="@+id/sbAudioSeek" fontPath="fonts/Roboto-Light.ttf" android:layout_width="@dimen/seek_width" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:background="@android:color/transparent" android:max="255" android:paddingRight="3dp" android:progress="0" android:progressDrawable="@drawable/seekbar_track_progress_notifier" android:splitTrack="false" android:thumb="@drawable/icon_thumb_notifier" <!-- 添加这两行,值设为你的9-patch轨道图片的实际高度 --> android:minHeight="20dp" android:maxHeight="20dp" />
这样可以避免SeekBar在大尺寸屏幕上自动放大高度,导致轨道位置偏移。
4. 用inset标签手动调整轨道位置
如果上面的方法都不行,可以尝试用inset标签包裹9-patch图片,手动修正偏移量:
比如修改background的item:
<item android:id="@android:id/background"> <inset android:drawable="@drawable/icon_track" android:insetTop="2dp" android:insetBottom="2dp" /> </item>
根据平板上的偏移情况调整insetTop和insetBottom的值,直到轨道居中显示。
这些方法里,我最推荐先检查9-patch的标记,再调整layer-list的gravity和SeekBar的高度约束,大部分平板偏移的问题都能通过这几步解决。
内容的提问来源于stack exchange,提问作者Pavan

