Переключение цвета Progressbar программно - PullRequest
5 голосов
/ 14 августа 2011

, поэтому у меня есть Layer-List с элементом с формой и сплошным цветом Теперь я хочу изменить этот цвет внутри моего кода.

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

Я попытался получить LayerDrawable и запросить первый элемент, теперь я застрял, получая 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);

edit: ок, поэтому я разработал новый план я пытался использовать 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, но я не получаю индикатор выполнения, отображаемый в списке уровней. Также я не знаю, на какой элемент мне нужно установить setLevel ()

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

эти вызовы дают мне странные результаты, например, только свежие элементы панели прогресса, имеющие 100% окраску прогресса, пахнут как проблема с кэшированием.

надеюсь, что кто-нибудь может рассказать мне, как правильно использовать LevelList в LayerList для Progressbar спасибо

1 Ответ

16 голосов
/ 07 марта 2012

Я знаю, что этому вопросу несколько месяцев, но я смог получить список уровней, работающий с индикатором выполнения.Хитрость заключается в том, чтобы назначить значения ваших уровней от 0 до 10000. В моем конкретном примере у меня было 3 уровня (красный / желтый / зеленый), используемых для представления срока службы батареи.

Вот как я это сделал:

res / drawable / progress_horizont_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_horizont_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_horizont_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>

Затем в файле макета мое объявление индикатора выполнения былокак это:

<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);
...