2011-08-14 74 views
5

所以我有一個具有形狀和純色的項目的圖層列表。現在我想在我的代碼中改變這種顏色。以編程方式切換進度條的顏色

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <clip> 
      <shape android:id="@+id/seekbar_shape_color"> 
       <solid android:color="#FFD00000" /> 
      </shape> 
     </clip> 

    </item> 
</layer-list> 

我tryed得到LayerDrawable和請求的第一個項目,現在IAM卡獲得clipDrawable最後得到ShapeDrawable

LayerDrawable sd = (LayerDrawable) v.getResources().getDrawable(R.drawable.seekbar_progress_bg); 
((ClipDrawable) sd.getDrawable(0)).get..(); 

我的另一種方法是讓ShapeDrawable與colorFilter設置顏色但那也不管用。

ShapeDrawable sd = (ShapeDrawable) v.getResources().getDrawable(R.id.seekbar_shape_color); 
sd.setColorFilter(R.color.cold_color,PorterDuff.Mode.MULTIPLY); 

編輯:行,所以我制定了新的計劃 我tryed使用LevelList像

<level-list 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:maxLevel="0" android:drawable="@color/hot_color"> 
    </item> 
    <item android:maxLevel="1" android:drawable="@color/cold_color"> 
    </item> 
</level-list> 

我認爲級別的默認值是0,但我不明白的進度條與LevelList一起顯示。 此外,我不知道我必須設置setLevel()

 holder.progressbar.getBackground().setLevel(0); 
     holder.progressbar.getIndeterminateDrawable().setLevel(0); 
     holder.progressbar.getProgressDrawable().setLevel(0); 

這個電話給我奇怪的結果只喜歡新鮮進度項目獲得100%的進度着色上哪個元素,聞起來像緩存問題。

希望有人能賜教如何正確使用LevelList上LayerList的進度 感謝

回答

15

我知道這個問題是一個幾個月大,但我能得到一個水平列表與進步工作酒吧。 訣竅是將您的等級值分配在0到10,000之間 在我的特殊示例中,我有3個等級(紅色/黃色/綠色)用於表示電池壽命。

這是我如何做的:

RES /繪製/ progress_horizo​​ntal_yellow.xml

<?xml version="1.0" encoding="utf-8"?> 

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:id="@android:id/background"> 
     <shape> 
      <corners android:radius="5dip" /> 
      <gradient 
        android:startColor="#ff9d9e9d" 
        android:centerColor="#ff5a5d5a" 
        android:centerY="0.75" 
        android:endColor="#ff747674" 
        android:angle="270" 
      /> 
     </shape> 
    </item> 

    <item android:id="@android:id/secondaryProgress"> 
     <clip> 
      <shape> 
       <corners android:radius="5dip" /> 
       <gradient 
         android:startColor="#80ffd300" 
         android:centerColor="#80ffb600" 
         android:centerY="0.75" 
         android:endColor="#a0ffcb00" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 

    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <corners android:radius="5dip" /> 
       <gradient 
         android:startColor="#ffffd300" 
         android:centerColor="#ffffb600" 
         android:centerY="0.75" 
         android:endColor="#ffffcb00" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 
</layer-list> 

RES /繪製/ progress_horizo​​ntal_red.xml

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

    <item android:id="@android:id/background"> 
     <shape> 
      <corners android:radius="5dip" /> 
      <gradient 
        android:startColor="#ff9d9e9d" 
        android:centerColor="#ff5a5d5a" 
        android:centerY="0.75" 
        android:endColor="#ff747674" 
        android:angle="270" 
      /> 
     </shape> 
    </item> 

    <item android:id="@android:id/secondaryProgress"> 
     <clip> 
      <shape> 
       <corners android:radius="5dip" /> 
       <gradient 
         android:startColor="#80ffd300" 
         android:centerColor="#80ffb600" 
         android:centerY="0.75" 
         android:endColor="#a0ffcb00" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 

    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <corners android:radius="5dip" /> 
       <gradient 
         android:startColor="#ffff0000" 
         android:centerColor="#ff990000" 
         android:centerY="0.75" 
         android:endColor="#ffff0000" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 

</layer-list> 

RES/drawable/progress_horizo​​ntal_green.xml

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

    <item android:id="@android:id/background"> 
     <shape> 
      <corners android:radius="5dip" /> 
      <gradient 
        android:startColor="#ff9d9e9d" 
        android:centerColor="#ff5a5d5a" 
        android:centerY="0.75" 
        android:endColor="#ff747674" 
        android:angle="270" 
      /> 
     </shape> 
    </item> 

    <item android:id="@android:id/secondaryProgress"> 
     <clip> 
      <shape> 
       <corners android:radius="5dip" /> 
       <gradient 
         android:startColor="#80ffd300" 
         android:centerColor="#80ffb600" 
         android:centerY="0.75" 
         android:endColor="#a0ffcb00" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 

    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <corners android:radius="5dip" /> 
       <gradient 
         android:startColor="#ff00ff00" 
         android:centerColor="#ff009900" 
         android:centerY="0.75" 
         android:endColor="#ff00ff00" 
         android:angle="270" 
       /> 
      </shape> 
     </clip> 
    </item> 
</layer-list> 

RES /繪製/ battery_charge_fill.xml

<?xml version="1.0" encoding="utf-8"?> 
<level-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:maxLevel="2999" android:drawable="@drawable/progress_horizontal_red" /> 
    <item android:maxLevel="4999" android:drawable="@drawable/progress_horizontal_yellow" /> 
    <item android:maxLevel="10000" android:drawable="@drawable/progress_horizontal_green" /> 
</level-list> 

然後在佈局文件我的進度條的聲明是這樣的:

<ProgressBar android:max="100" 
    android:progress="60" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/BatteryLevelProgress" 
    style="@android:style/Widget.ProgressBar.Horizontal" 
    android:progressDrawable="@drawable/battery_charge_fill" /> 

然後在Java中:

//progress is between 0 and 100 so set level of drawable to progress * 100 
Drawable batteryProgressD = batteryProgressBar.getProgressDrawable(); 
batteryProgressD.setLevel(progress*100); 
batteryProgressBar.setProgress(progress);