Switching Color of a Progressbar programmatically

前端 未结 1 659
忘了有多久
忘了有多久 2021-02-06 13:50

so i have a Layer-List with an Item with a shape and a solid color. Now i want to change this color inside my code.



        
相关标签:
1条回答
  • 2021-02-06 13:55

    I know this question is a few months old but I was able to get a level-list working with a progress bar. The trick is to assign your levels values between 0 and 10,000 In my particular example I had 3 levels (red/yellow/green) used to represent battery life.

    Here is how I did it:

    res/drawable/progress_horizontal_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/drawable/progress_horizontal_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_horizontal_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/drawable/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>
    

    Then in the layout file my progress bar declaration was like this:

    <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"   />
    

    Then in 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);
    
    0 讨论(0)
提交回复
热议问题