Як змінити колір ходу смуги прогресу в Android


473

Я використовую горизонтальну смугу прогресу у своєму додатку Android, і я хочу змінити його колір прогресу (який за замовчуванням є Жовтий). Як я можу це зробити за допомогою code(не XML)?


Ви спробували MyProgressBar.setProgressDravable (Drawable d) із зазначенням растрової карти з потрібним кольором? developer.android.com/reference/android/widget/… developer.android.com/reference/android/graphics/dravable/…
fupsduck

2
Так, я спробував це, але це не працює. Він встановлює колір фону для всього перегляду панелі прогресу, а не встановлює колір тла лише для самої смуги. Дякую.
WhiteTigerK

21
android:indeterminateTint="@android:color/white"працює лише на API> = 21
Madeyedexter

Відповіді:


290

Вибачте, що це не відповідь, але що визначає вимогу, встановивши її з коду? І .setProgressDrawableмає працювати, якщо це визначено правильно

<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="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

4
Причина полягає в тому, що я динамічно створюю панель прогресу і встановлюю її колір за запитом користувача. Оскільки я зазвичай використовую код для створення свого екрана та компонентів графічного інтерфейсу, я не знайомий із доданим XML і не знаю, що таке перелік шарів (хоча я здогадуюсь, що ви будуєте панель прогресу на основі декількох шарів ..). У разі, якщо я хочу використовувати XML, який ви додали - де я повинен розмістити його у папці проекту і чи потрібно щось більше зробити для створення панелі прогресу на основі налаштувань XML? Дякую.
WhiteTigerK

1
Ви зберігаєте цей xml як файл і поміщаєте його у папку, що витягується (скажімо, my_progress.xml), ніж ви встановлюєте його як малюнок у MyProgressBar.setProgressDravable () Щоб змінити кольори - вам потрібно буде змінити ці значення у @ color / progress_start @ color / progress_end Це в основному градієнт, і ви можете помістити туди шестигранну.
Олексій Воловий

3
Примітка - файл - це копія тієї, яка є в SDK. Я тут скинув авторські права. Якщо ви заглянете в папку Res / Drawable, ви побачите саме те, що я розмістив - кольори встановлюються на жовтий градієнт, а не на власні кольори.
Олексій Воловий

7
Його не показує жодної зміни кольору. скажіть, будь ласка, колір, який вийшов.
Praveen

Привіт Алекс, ваші відповіді дуже приємні. але я намагаюся змінити користувальницький колір колеса прогресу під час виконання. але, я не міг. Будь ласка , допоможіть мені вирішити мою проблему .. після прогресу reaches100%, то це зміна часу колір і почати progress..i код завантаження з цього .. stackoverflow.com/questions/18503718 / ...
Харікрішнан

485

Для горизонтального ProgressBar ви також можете використовувати a ColorFilter, як-от так:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

Червоний ProgressBar за допомогою кольорового фільтра

Примітка. Це змінює зовнішній вигляд усіх смуг прогресу у вашій програмі. Щоб змінити лише одну певну панель прогресу, зробіть це:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

Якщо progressBar невизначений, тоді використовуйте getIndeterminateDrawable()замість getProgressDrawable().

З Lollipop (API 21) ви можете встановити відтінок прогресу:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

Червоний ProgressBar з використанням відтінку прогресу


7
Я хотів використати цю відповідь так, як мені здалося найпростішим, але мій рядок прогресу повністю червоний, незалежно від значення прогресу. Ви впевнені в режимі використання?
LG

33
@resus У мене така ж проблема, смужка була повністю червоною і прогресу не було видно. Але я вирішив це, змінивши Mode.SRC_IN на Mode.MULTIPLY.
Дерзу

40
Не забувайте робити те саме, getIndeterminateDrawableякщо ви використовуєте невизначений прогрес.
Томмі


9
як не змінити колір тла? Я просто хочу змінити колір прогресу.
kangear

364

Це не програмно, але я думаю, що це може допомогти багатьом людям у будь-якому випадку.
Я багато намагався, і найефективнішим способом було додати ці рядки до мого ProgressBar у .xml-файл:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

Отже, врешті-решт, цей код зробив це для мене:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

Це рішення працює для API 21+


45
Потрібен мінімальний рівень API 21
Apfelsaft

Існують також методи встановлення цих властивостей, які можна викликати, якщо необхідно встановити динамічний колір.
racs

Чи потрібно робити спеціальний файл ресурсів для api 21+ та api <= 20? Або ці атрибути просто ігноруються в api <= 20?
prom85

1
@shriduttkothari як це може бути найкращим? ... це від
21+

2
Найкраща відповідь, коли Android відхиляється від мінімуму 4.x
Том,

229

Для моєї невизначеної смуги прогресу (спінер) я просто встановив кольоровий фільтр на перетягуваному. Чудово працює і лише одна лінія.

Приклад встановлення кольору червоного:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

введіть тут опис зображення


16
Мені подобається ваша відповідь найкраще. Щоб моя працювала, хоча мені довелося це зробити: myProgressBarSpinner.getIndeterminateDravable (). SetColorFilter (новий LightingColorFilter (0xFF000000, foregroundColorDesired));
Art Geigel

4
Також зауважте, що це дозволить змінити малюнки ВСІХ смуг прогресу у вашому додатку. Щоб зробити це лише для певного, зателефонуйте mutate () на файл Dravable, а потім встановіть на ньому кольоровий фільтр, а потім викликайте setIntederminateDravable на своєму пробірі.
димзуз

3
Примітка. Тим, хто користується цим і цікавиться, чому їх колір не виглядає точно так, як вкладено шістнадцятковий рядок, у ньому є багатоколірний фільтр. Перейдіть android.graphics.PorterDuff.Mode.MULTIPLYна PorterDuff.Mode.SRC_INі ви отримаєте точний шістнадцятковий колір.
micnguyen

Я думаю, що йому просто потрібна ця відповідь ..... android: indeterminateTint = "@ android: color / black"
Мухаммед Аділ

4
я використовувався як: progressBar = (ProgressBar) findViewById (R.id.progressBar); progressBar.getIndeterminateDravable (). setColorFilter (ContextCompat.getColor (це, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
ashishdhiman2007

188

Це старе питання, але використання теми тут не згадується. Якщо використовується ваша тема за замовчуванням AppCompat, ваш ProgressBarколір будеcolorAccent вами.

Зміна colorAccentтакож змінить ваш ProgressBarколір, але зміни також відображаються в багатьох місцях. Отже, якщо ви хочете іншого кольору лише для певного, PregressBarви можете зробити це, застосувавши до цього тему ProgressBar:

  • Розширіть свою тему за замовчуванням і перезазначте colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
  • І ProgressBarдодамо android:themeатрибут:

    android:theme="@style/AppTheme.WhiteAccent"

Так буде виглядати приблизно так:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

Таким чином, ви просто змінюєте colorAccentдля вашого конкретногоProgressBar .

Примітка : Використання styleне вийде. Використовувати потрібно android:themeлише. Більше використання теми можна знайти тут: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


18
нарешті! дякую, схоже, що не багато розробників використовують AppCompat, багато користувачів просто голосують відповіді з рішенням для API 21+, зовсім не добре, вони повинні підтримувати більше пристроїв / ОС, наскільки це можливо
user25

1
Дивовижно! Працював для мене, але я повинен був переконатися, що є хтось з батьків = "@ style / Theme.AppCompat" десь до ієрархії стилів. У мене був інший батько, і він спочатку не працював.
Nublodeveloper

@Nublodeveloper Так, я це згадав у першому рядку, якщо ви помітили.
kirtan403

1
@ kirtan403 Ага, так, я розумію, зараз ти це згадаєш, але я не зрозумів це таким чином, коли я вперше прочитав це. Я прочитав це занадто швидко, і шукав код. Все одно дякую, ваша відповідь найкраща для мене!
Nublodeveloper

+1 сподобалось ваше рішення. Але як встановити колір теми в java ??? Наприклад, якщо я хочу, щоб він був червоним <color name = "red"> # ff5900 </color>
Maseed

54

Усі API

якщо використовувати весь API, просто створіть тему в стилі

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

і використовувати в процесі роботи

<ProgressBar
    ...
    android:theme="@style/progressBarBlue" />

API рівня 21 і вище

якщо використовується в API рівня 21 і вище, просто використовуйте цей код:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

1
Добре, я думаю, що метод style.xml найкращий. (Не потрібно понад 20
квіт.

1
Найкраще рішення, якщо ви хочете знайти одне рішення для всіх API Подяки :)
Naveen

34

відповідно до деяких пропозицій, ви МОЖЕТЕ вказати форму та викреслити з кольором, а потім встановити її. У мене це працює програмно. Ось як я це роблю ..

Спершу переконайтеся, що ви імпортуєте бібліотеку, що переглядається ..

import android.graphics.drawable.*;

Потім використовуйте код, аналогічний наведеному нижче;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);

1
Я спробував код вище, на жаль, він просто призводить до "порожнього" рядка прогресу. Я щось пропускаю?
OceanBlue

Вам потрібно зателефонувати setLevel на ClipDrawable. Значення займає від 0 до 10000. Отже, progress.setLevel (2500) буде заповнений на 25%.
HappyEngineer

1
Я подав редагування у відповідь, в якому пояснюється одна причина "порожньої" смужки прогресу - і два способи її виправити (в т.ч. @ виправлення HappyEngineer)
Річард Ле Месюр'є,

@RichardLeMesurier Ви можете розмістити пояснення + 2 способи в розділі коментарів? progress.setLevel(2500)не працює для мене, і, мабуть, ваша редакція чомусь не була прийнята. Дякую. +1.
ateiob


32

Це працювало для мене:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

12
Використовується лише в API рівня 21 і вище
Numair

28

якщо невизначено:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

Я використовував це, але воно не оживляє, просто застосовано колір ... Я використовую кругову
панель

24

Це працює для мене. Він також працює для нижчої версії. Додайте це до свого syles.xml

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

І використовувати його так у xml

<ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:theme="@style/ProgressBarTheme"
   />

Я реалізував це у зразковому додатку CryptoTweets . Я виявив, що батьківська тема не потрібна, щоб це рішення працювало так, як очікувалося. parent="ThemeOverlay.AppCompat.Light"
Адам Гурвіц

23

Сьогодні у 2016 році я виявив, що деякі пристрої до Lollipop не шанують colorAccentналаштування, тому моє остаточне рішення для всіх API - це наступне:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

Для бонусних очок він не використовує жодного застарілого коду. Спробуй це!


Не забудьте зателефонувати wrapDrawable.mutate()зDrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
Тарсем Сінгх

Не працює на Android KitKat 4.4.2.
pradip tilala

Просто спробував (знову) на новому емуляторі 4.4.2, і він працює без жодних проблем, перевірте свої .xmlналаштування, а також якщо щось інше перекриває ProgressBarколір.
де Соуза

20

Це те, що я зробив. Працювали.

Індикатор виконання:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdravable.xml:
Тут використовуйте градієнт, щоб змінити колір, як вам подобається. І android: toDegrees = "X" збільшує значення X, а панель прогресу швидко обертається. Зменшіться і він обертається повільно. Настройте відповідно до своїх потреб.

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

зразок: введіть тут опис зображення


Це показує абсолютно іншу (погано виглядає) анімацію, ніж типова.
Ixx

18

Зроби цю ж проблему, працюючи над зміною зовнішнього вигляду смужки прогресу за замовчуванням. Ось ще інформація, яка, сподіваємось, допоможе людям :)

  • Ім'я файлу xml має містити лише символи: a-z0-9_.(тобто, без великих літер !)
  • Для посилання на ваше "малювання" це R.drawable.filename
  • Щоб замінити зовнішній вигляд за замовчуванням, ви використовуєте myProgressBar.setProgressDrawable(...), однак вам не потрібно просто посилатися на ваш власний макет як R.drawable.filename, вам потрібно отримати його як Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • Вам потрібно встановити стиль перед тим, як встановити прогрес / вторинний прогрес / макс (встановлення його згодом для мене призвело до "порожнього" рядка прогресу)

15

Напевно, є одна річ, на яку не згадувались у цій відповіді:

Якщо ваша тема успадковується з Theme.AppCompat, ProgressBarбуде приймати колір, який ви визначили"colorAccent" у вашій темі.

Отже, використовуючи ..

<item name="colorAccent">@color/custom_color</item>

.. підфарбує колір ProgressBar автоматично на @color/custom_color.


1
Мені потрібно було використовувати <item name = "android: colorAccent"> @ color /
light


15

Ви можете спробувати змінити стилі, теми або за допомогою android: indeterminateTint = "@ color / yourColor" де завгодно, але існує лише один спосіб зробити це для будь-якої версії Android SKD:

Якщо смуга прогресу не визначена, скористайтеся:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

Якщо панель прогресу невизначена, будь ласка, використовуйте:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

Сумно, що Android такий безлад!


Дякую! Він працює для невизначеного ProgressBar, але для його визначення фарбує кольором цілу гаму.
CoolMind

14

Як я це зробив у горизонтальному прогресі:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

2
Я робив те саме, плюс зміна кольору фону: layerDravable.findDravableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
Камен Добрев

1
Ця відповідь разом із коментарем @KamenDobrev є єдиним, хто насправді зробив те, що я хотів. Коли я встановлюю лише фільтр кольорів для прогресу, то малювання кольорів фону також змінюється.
m_katsifarakis

13

Найпростіше рішення, якщо ви хочете змінити колір у файлі формату xml, використовуйте наведений нижче код та використовуйте властивість indeterminateTint для потрібного кольору.

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

12

Це рішення працювало для мене:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

8

Ще одна дрібниця, тематичне рішення спрацьовує, якщо ви успадковуєте базову тему, тож для компактної програми вашою темою має бути:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

А потім встановіть це в темі панелі прогресу

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>

7

Щоб змінити горизонтальний колір ProgressBar (в kotlin):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

Щоб змінити невизначений колір ProgressBar:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

І це, нарешті, зазвичай підфарбовує попередній прогрес-леді

тонізований прогрес на api 19


6

Спеціальний стиль матеріалу в горизонтальній смузі прогресу:

Щоб змінити колір тла та хід горизонтальної смуги ходу.

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

Застосуйте його до панелі прогресу, встановивши атрибут стилю, для користувальницьких стилів матеріалів та спеціальної перевірки панелі прогресу http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


3
для цього потрібен мінімальний рівень api 21
Шихаб Уддін

6

Опубліковано, щоб додати інформацію про відповідь PaulieG , оскільки ateiob попросив мене щось пояснити ...


Я можу сказати, що є (або, принаймні, був на момент написання, коли я переглянув цю поточну версію вихідного коду Android) помилка / проблема / оптимізація в ProgressBarкоді, який ігнорує спробу встановити прогрес на значення вже в.

  • тобто якщо прогрес = 45, а ви спробуєте встановити його на 45, код нічого не зробить і не перемальовує прогрес .

Після дзвінка ProgressBar.setProgressDrawable()панель прогресу буде порожньою (оскільки ви змінили чергову частину).

Це означає, що вам потрібно встановити хід і перемалювати його. Але якщо ви просто встановите прогрес на збережене значення, це нічого не зробить.

Спочатку потрібно встановити його на 0, потім знову на "старе" значення, і панель перемальовується.


Отже, підсумовуючи:

  • зберегти "старе" значення прогресу
  • оновити графічний / кольоровий (робить смугу порожньою)
  • скинути прогрес до 0 (інакше наступний рядок нічого не робить)
  • скинути прогрес до "старого" значення (панель виправлень)
  • визнати недійсним

Нижче наведено метод, який у мене є:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

Що стосується рішення HappyEngineer, я думаю, це було подібне рішення, щоб вручну встановити "прогрес" зміщення. У будь-якому випадку вищевказаний код повинен працювати для вас.


Дякую .. це справді працює .. але як мій малюнок був статичним (з ресурсів) .. він не працював. Він працював лише після того, як я додав "dravable.invalidateSelf ();" до 'setProgress (0)' та 'setProgressDrawable (drawable)'
Alécio Carvalho


5

просто використовуйте:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}

4

Для горизонтального стилю ProgressBar я використовую:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

Приклад дзвінка:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

Якщо вам не потрібен "вторинний прогрес", просто встановіть значення2 у значення1.


4

Застосуйте цей спеціальний стиль до панелі прогресу.

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ dravable / progress.xml -

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

Використовуйте цей тип зображення для панелі прогресу. введіть тут опис зображення

Для кращого результату ви можете використовувати декілька зображень прогресу. І будь ласка, не соромтесь із використанням зображень, адже сама платформа Android використовує зображення для панелі прогресу. Код витягується з sdk :)


4

Відповідно до запропонованого Muhammad-Adil для SDK версії 21 і вище

android:indeterminateTint="@color/orange"

у XML Works для мене досить легко.


Якщо ви хочете змінити весь додаток, будь ласка, змініть значення <color name = "RedAccent"> # FE6C27 </color>. у ваших Значеннях / color.xml.
магіл

4

Ось код для зміни кольору ProgressBar програмним шляхом.

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.