2

我打算制作一个自定义搜索栏,使用我自己的一组图像作为背景和进度可绘制对象。我制作了 2 个 9-patch 图像,每个用于背景和进度可绘制对象。这是我用于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

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

4

1 回答 1

0

事实证明,这里有几件事在起作用。

1) 我使用 9-patch 图像作为 seekBar 背景和进度可绘制对象。但是,我不知道 9-patch 图像除了顶部和左侧边缘的拉伸线外,还有右侧和底部边缘的填充线。这些定义了图像的内容区域,剩下的区域自动成为填充区域(即非内容区域计入该图像将用作背景的视图的填充)。此外,如果没有指定填充线,android 使用拉伸线作为填充线。

2)在层列表中,项目的填充堆叠起来。这意味着如果 layer-list 中的第一项有一些内边距,则该内边距将累加到它之后的所有项目的内边距,第二项的内边距加起来是它下面所有项目的内边距,依此类推。

所以在我的例子中,用作 seekBar 背景的 9-patch 图像(图层列表中的第一项)得到了一些意想不到的填充(因为拉伸线被用作填充线),并且 seekBar 进度可绘制将此填充添加到它的自己的意外填充(同样,因为它是一个 9 补丁)导致它显示在背景下方。

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

于 2013-08-29T21:43:48.213 回答