我打算制作一个自定义搜索栏,使用我自己的一组图像作为背景和进度绘图。我制作了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)
经过数十个自定义搜索栏教程后,我仍然坚持在这里可能出错的地方。这可能是非常微不足道的事情,但我无法发现它。
答案 0 :(得分:0)
事实证明,这里有几件事情在发挥作用。
1)我使用9-patch图像作为seekBar背景和进度drawables。但是,我不知道9补丁图像除了顶部和左边的拉伸线外,还有右边和底边的填充线。这些定义了图像的内容区域,并且剩下的区域自动变为填充区域(即,非内容区域朝向该图像将用作背景的视图的填充计数)。此外,如果未指定填充行,则android将拉伸线用作填充线。
2)在图层列表中,项目的填充堆叠起来。这意味着如果图层列表中的第一项具有一些填充,则此填充将累加到其后的所有项目的填充,第二项的填充将累加到其下面的所有项目的填充,依此类推。
所以在我的例子中,用作seekBar背景的9补丁图像(图层列表中的第一项)得到了一些非预期的填充(因为拉伸线被用作填充线),而seekBar进度drawable得到了这个填充添加到它自己的非预期填充(再次,因为它是一个9补丁)导致它显示在背景下面。
为了纠正这个问题,我更改了9个补丁图像并将填充线设置为它们的全长,即我将整个图像定义为内容区域。没有其他选项,因为任何填充都会导致进度可绘制的填充的两倍,使其从预期位置(正好在背景可绘制之上)移位。