2013-08-20 61 views
2

我打算使用自己的一組圖像作爲背景和進度可繪製的自定義seekbar。我製作了2個9-補丁圖像,每個圖像用於背景和進度可繪製的圖像。下面是我使用的progressDrawable代碼:Android:自定義seekbar進度drawable渲染不正確

<?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> 

的問題是,在繪製的進度部都被下面的背景部分,而不是直接重疊它。

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

實際輸出:(http://i.imgur.com/ftNlMMI.png

已經通過數萬定製了搜索條的教程,我仍然停留在我可能是錯在這裏做可能。這可能是非常微不足道的,但我無法發現它。

回答

0

事實證明這裏有幾件事。

1)我用seekBar背景和進度drawables 9補丁圖像。但是,我不知道除了上邊和左邊的拉伸線之外,9貼片圖像還有右邊和底邊的填充線。這些定義了圖像的內容區域,並且該區域自動成爲填充區域(即,非內容區域計算爲將該圖像用作背景的視圖的填充)。另外,如果沒有指定填充行,android會使用拉伸線作爲填充線。

2)在圖層列表中,項目的填充疊加起來。這意味着如果一個圖層列表中的第一個項目有一些填充,這個填充將加起來就是後面所有項目的填充,第二個項目的填充加起來就是它下面所有項目的填充,等等。所以在我的情況下,用作seekBar背景(層列表中的第一項)的9-patch圖像得到了一些意想不到的填充(因爲拉伸線被用作填充線),並且seekBar進度可繪製得到了這個填充添加到它自己的意外填充(再次,因爲它是一個9補丁),導致它顯示在背景下面。

爲了解決這個問題,我改變了9-patch圖像,並將填充線設置爲全長,即我將整個圖像定義爲內容區域。沒有其他選擇,因爲任何填充都會導致可展開進度的兩倍填充,從預期位置(它恰好高於可繪製背景)取代它。