app在使用seekbar的时候,往往会对seekbar进行部分的自定义,因此也会引入一些问题。
比如thumb(拖动的点)位置不对,左偏或者右偏移,或者脱离进度条等问题。
这其中是对部分参数的使用不当造成的。
一、先看seekbar的布局:
1.seekbar.java中
public SeekBar(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.seekBarStyle);
}
到res的xml中查找这个attr:
2.res中的定义
attrs.xml 672 <attr name="seekBarStyle" format="reference" />
一般都是holo的
themes_holo.xml 282 <item name="seekBarStyle">@style/Widget.Holo.SeekBar</item>
可以看到从seekBarStyle到SeekBar的定位第一步完成了。
3.找下这个Holo.SeekBar的定义:
在style里面(@style/Widget.Holo.SeekBar):进到里面看一下,详细的参数:
519 <style name="Widget.Holo.SeekBar">
520 <item name="indeterminateOnly">false</item>
521 <item name="progressDrawable">@drawable/scrubber_progress_horizontal_holo_dark</item>
522 <item name="indeterminateDrawable">@drawable/scrubber_progress_horizontal_holo_dark</item>
523 <item name="minHeight">13dip</item>
524 <item name="maxHeight">13dip</item>
525 <item name="thumb">@drawable/scrubber_control_selector_holo</item>
526 <item name="thumbOffset">16dip</item>
527 <item name="focusable">true</item>
528 <item name="paddingStart">16dip</item>
529 <item name="paddingEnd">16dip</item>
530 <item name="mirrorForRtl">true</item>
531 </style>
到此算是找到了seekbar的布局定义。
下面就分别来理解一下各个参数什么意思,以便在自定义的时候合理的使用。
二、参数解释
1.indeterminateOnly
//TODO:
2.progressDrawable
是进度条的一个drawable的布局:可以自定义个不同的进度条。在app的xml中对这个进行重新定义就可以了。
drawable/scrubber_progress_horizontal_holo_dark.xml
17<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
18 <item android:id="@android:id/background"
19 android:drawable="@android:drawable/scrubber_track_holo_dark" />
20 <item android:id="@android:id/secondaryProgress">
21 <scale android:scaleWidth="100%"
22 android:drawable="@android:drawable/scrubber_secondary_holo" />
23 </item>
24 <item android:id="@android:id/progress">
25 <scale android:scaleWidth="100%"
26 android:drawable="@android:drawable/scrubber_primary_holo" />
27 </item>
28</layer-list>
3.indeterminateDrawable
//TODO:4.minHeight maxHeight
设置seekabr的最大最小高度。
5.thumb
定义thumb的图片
6.thumbOffset
定义thumb的偏移位置,想对于进度条启始点的位置。这里是16dp,因为图片是原型的,大小是32dp,偏移16使得圆心在进度条的启始点。
7.paddingStart paddingEnd
设置seekbar整个控件左右距离空多少个dp用的。
三、自定义seekbar的时候,要注意的是图片和thumbOffset;
会导致thumb左右偏离progress的启始点,
其中AbsSeekBar中,会获取这个值:
130 final int thumbOffset = a.getDimensionPixelOffset(
131 R.styleable.SeekBar_thumbOffset, getThumbOffset());
132 setThumbOffset(thumbOffset);
初始seekbar:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="500dp"
tools:context="com.example.spreadtrumshitaoli.simpleseekbar.MainActivity">
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
1.图片和thumbOffset没有合理配置:这里thumb用的系统的,半径还是16dp,设置不配套的offset后:
<SeekBar
android:thumbOffset="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>