Android:自定义搜索栏进度可绘制不正确

时间:2013-08-20 10:41:23

标签: android custom-controls drawable seekbar

我打算制作一个自定义搜索栏,使用我自己的一组图像作为背景和进度绘图。我制作了2张9张补丁图片,每张图片用于背景和进度绘图。这是我用于progressDrawable的代码:

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

    <item android:id="@+id/background"
        android:drawable="@drawable/experience_seekbar_background" />

    <item android:id="@+id/progress">
        <clip
            android:clipOrientation="horizontal"
            android:gravity="left|top"
            android:drawable="@drawable/experience_seekbar_progress" />
    </item>
</layer-list>

此外,这是我的搜索栏的xml定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp" >

    <SeekBar
        android:id="@+id/experienceSeekBar"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:max="2"
        android:progress="1"
        android:progressDrawable="@drawable/experience_seekbar" />
</LinearLayout>

问题是,drawable的进度部分是在背景部分下面绘制的,而不是直接重叠它。

预期/期望:(http://i.imgur.com/C27dQZK.png

实际输出:(http://i.imgur.com/ftNlMMI.png

经过数十个自定义搜索栏教程后,我仍然坚持在这里可能出错的地方。这可能是非常微不足道的事情,但我无法发现它。

1 个答案:

答案 0 :(得分:0)

事实证明,这里有几件事情在发挥作用。

1)我使用9-patch图像作为seekBar背景和进度drawables。但是,我不知道9补丁图像除了顶部和左边的拉伸线外,还有右边和底边的填充线。这些定义了图像的内容区域,并且剩下的区域自动变为填充区域(即,非内容区域朝向该图像将用作背景的视图的填充计数)。此外,如果未指定填充行,则android将拉伸线用作填充线。

2)在图层列表中,项目的填充堆叠起来。这意味着如果图层列表中的第一项具有一些填充,则此填充将累加到其后的所有项目的填充,第二项的填充将累加到其下面的所有项目的填充,依此类推。

所以在我的例子中,用作seekBar背景的9补丁图像(图层列表中的第一项)得到了一些非预期的填充(因为拉伸线被用作填充线),而seekBar进度drawable得到了这个填充添加到它自己的非预期填充(再次,因为它是一个9补丁)导致它显示在背景下面。

为了纠正这个问题,我更改了9个补丁图像并将填充线设置为它们的全长,即我将整个图像定义为内容区域。没有其他选项,因为任何填充都会导致进度可绘制的填充的两倍,使其从预期位置(正好在背景可绘制之上)移位。