抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

安卓SeekBar自定义(适配5.0无法显示的问题)

项目需求定义seekbar,本来以为很简单,但是踩了挺久坑,总结如下:

对于安卓5.1以上的设备,直接定义android:progressDrawableandroid:thumbandroid:splitTrack即可达到想要的效果。style如下:

<style name="SeekBarStyle" >
    <item name="android:splitTrack">false</item>
    <item name="android:progressDrawable">@drawable/seekbar_background</item>
    <item name="android:thumb">@mipmap/seekbar_thumb</item>
</style>

thumb可使用图片(用于带阴影的滑块)然后配合splitTrack达到滑块透明效果,不会遮挡背景。

对于progressDrawable也只需按常规drawable去写即可,没有什么特别的。

例子:seekbar_background.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--定义seekbar滑动条的底色-->
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="2dp" />
            <solid android:color="?color_seekbar_background" />
        </shape>
    </item>
    <!--定义seekbar滑动条进度颜色-->
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />
                <solid android:color="@color/orange" />
            </shape>
        </clip>
    </item>
</layer-list>

但是对于5.1需要做不同处理。【1,无法显示进度条】因为按以上的方式无法显示,主要原因是5.1的android:progressDrawable需要三个层级区分。

例子:seekbar_background_v21.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!--定义seekbar滑动条的底色-->
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="2dp" />
            <solid android:color="?color_seekbar_background" />
        </shape>
    </item>
    <!--这个进度一般用不着-->
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <solid android:color="@android:color/transparent" />
            </shape>
        </clip>
    </item>
    <!--定义seekbar滑动条进度颜色-->
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />
                <solid android:color="@color/orange" />
            </shape>
        </clip>
    </item>
</layer-list>

然后可以看到背景色了,此外就是滑块的定义,实际上没什么特别的,但如果seekbar限定了高度,【2,滑块无法居中】则需要解决居中问题,解决办法是将高度定义为wrap_content,【3,背景和进度条高度太高】然后会出现背景和进度条太大的问题,这时候使用android:minHeightandroid:maxHeight去限制进度条的高度。

在style-v21中定义不同的drawable:

<style name="SeekBarStyle" >
    <item name="android:splitTrack">false</item>
    <item name="android:progressDrawable">@drawable/seekbar_background_v21</item>
    <item name="android:thumb">@mipmap/seekbar_thumb</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:minHeight">4dp</item>
    <item name="android:maxHeight">4dp</item>
</style>

【4,无法拉满进度条】此外关于滑块无法拉满进度条的问题,主要是下面这个属性的问题

<item name=”android:thumbOffset”>0dp</item>

去除后可正常拉满。

【5,滑块拉满被父view裁剪】关于滑块拉满后被父view裁剪的问题,主要是在父view中加上这两个属性:

android:clipChildren="false"
android:clipToPadding="false"

以上,seekbar应该没什么问题了。

参考:https://blog.csdn.net/s10461/article/details/80676258


0条评论

发表评论