Як змінити андроїд невизначений колір ProgressBar?


74

Я хотів би знати, як я можу змінити невизначений ProgressBarколір з базового білого / сірого кольору на чорний? Коли я змінюю indeterminateDrawable, я отримую статичне зображення замість рухомої анімованої смуги прогресу. Чи є спосіб зробити це просто в XML?

Відповіді:


81
progressBar.getIndeterminateDrawable().setColorFilter(
            getResources().getColor(Your_Color),
            android.graphics.PorterDuff.Mode.SRC_IN);

і замініть Your_Color потрібним кольором, наприклад: R.color.your_color_code


Це найшвидший і найпростіший спосіб.
Поу Арландіс Мартінес

14
Можна визначити в xml:android:indeterminateTint="@colors/your_color" android:indeterminateTintMode="src_in"
Пітер Чжао,

2
@zhaoyuanjie android: indeterminateTint працює лише на рівні 21+ API
Vinay W

Я радий, що прокрутив вниз - це має бути прийнятою відповіддю.
Zsolt Safrany

чи справді необхідний весь той бізнес портера Дафа? :(
Nerdy Bunz

64

Щоб отримати ProgressBar у темі за замовчуванням, яка буде використовуватися на білій / світлій підкладці, використовуйте один із зворотних стилів:

<ProgressBar style="@android:style/Widget.ProgressBar.Inverse"/>
<ProgressBar style="@android:style/Widget.ProgressBar.Large.Inverse"/>
<ProgressBar style="@android:style/Widget.ProgressBar.Small.Inverse"/>

Зазвичай це дає вам чорний колір на прозорому ProgressBar, але деякі інсталяції ОС використовують власні ресурси. Якщо ви шукаєте певний колір, вам доведеться прокрутити власні малюнки, дотримуючись інструкцій, наданих CommonsWare.


Здається, це не агностичне рішення щодо використання пристрою. На моєму LG Optimus 2X Speed ​​невизначений ProgressBar все ще завжди чорний, тоді як на HTC Desire HD з CyanogenMod для 2.3.3 він завжди червоний.
Paul Lammertsma,

@ Пол - Так, ти маєш рацію. Багато виробників пристроїв налаштовують теми, і тема за замовчуванням може змінюватися між версіями Android. Я виправлю текст вище
Anm,

34

Я бачу, що інші відповіді досить старі, щоб змінити невизначений колір ProgressBar, вам просто потрібно встановити android:indeterminateTintта android:indeterminateTintModeатрибути у вашому ProgressBarелементі безпосередньо в XML:

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminateTint="@color/colorPrimary"
    android:indeterminateTintMode="src_in"
    android:indeterminate="true" />

android:indeterminateTint - Відтінок, який застосовуватиметься до невизначеного індикатора прогресу.

Повинно бути значення кольору, в формі "#rgb", "#argb", "#rrggbb", "#aarrggbb", або посилання на ресурс @color/colorPrimary.

android:indeterminateTintMode - Режим змішування, що використовується для застосування відтінку індикатора прогресу.

Має бути одне з наступних значень констант:
add, multiply, screen, src_atop, src_inабоsrc_over

Методами Getter та Setter для цих атрибутів є:

Усі вони були додані до рівня API 21


1
Так розчаровує! В андроїд-студії вам потрібно скористатися опцією Переглянути всі атрибути, щоб отримати доступ до indeterminateTintMode, а потім змінити його на src_in ... Я НЕ збирався розбиратися в цьому самостійно. Дякую!
Скутер


6
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/bg" />
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/secondary" />
    <item android:id="@android:id/progress" android:drawable="@drawable/progress" />
</layer-list>

3

Для API менше 23 використання

progressBar.getIndeterminateDrawable().setColorFilter(
       getResources().getColor(Your_Color),
        android.graphics.PorterDuff.Mode.SRC_IN);

в іншому випадку використовувати

progressBar.getIndeterminateDrawable().setColorFilter(
        ContextCompat.getColor(context, Your_Color),
        android.graphics.PorterDuff.Mode.SRC_IN);

1

Замінити android:colorControlActivatedу своїй AppTheme, яка повинна бути у вашому styles.xml:

<style name="AppTheme" parent="...">
    ...
    <item name="android:colorControlActivated">@color/beautiful_color</item>
    ...
</style>

Працює над API 21+


1
Найпростіший спосіб. Дякую!
MasterMind

-5

насправді все, що вам потрібно зробити (як для cirle, так і для bar), - це створити xml-файл у форматі, що малюється, як показано нижче ...... progress_spinner_001 вказує на будь-яке зображення, яке ви хочете анімувати, і тривалість ... як довго ви хочете відображати кожен фрейм для ....... та встановіть ur android: indeterminateDrawable = ім'я файлу_в_драуабелі ....

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
<item android:drawable="@drawable/progress_spinner_001" android:duration="300" />
<item android:drawable="@drawable/progress_spinner_002" android:duration="300" />
<item android:drawable="@drawable/progress_spinner_003" android:duration="300" />
  <item android:drawable="@drawable/progress_spinner_004" android:duration="300" />
    <item android:drawable="@drawable/progress_spinner_005" android:duration="300" />
      <item android:drawable="@drawable/progress_spinner_006" android:duration="300" />
     <item android:drawable="@drawable/progress_spinner_007" android:duration="300" />
    <item android:drawable="@drawable/progress_spinner_008" android:duration="300" />
</animation-list>

ps u, можливо, доведеться змінити розмір індикатора прогресу, щоб показати його за бажанням


4
-1: ця відповідь говорить "як показано нижче", але вона нічого не показує. Мені це дуже важко зрозуміти.
Richard Le Mesurier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.