سؤال

أستخدم شريط تقدم أفقي في تطبيق Android الخاص بي، وأريد تغيير لونه التقدمي (وهو أصفر افتراضيا). كيف يمكنني أن أفعل ذلك باستخدام code (وليس XML)؟

هل كانت مفيدة؟

المحلول

أنا آسف لأنها ليست هي الحل، ولكن ما يقود الشرط إعداده من التعليمات البرمجية؟ و .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>

نصائح أخرى

بالنسبة للقدس الأفقي، يمكنك استخدام ColorFilter, ، أيضا، مثل هذا:

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

Red ProgressBar using color filter

ملحوظة: هذا يعدل ظهور جميع أشرطة التقدم في تطبيقك. لضبط شريط التقدم المحدد فقط، قم بذلك:

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

Red ProgressBar using progress tint

هذا ليس برمجيا ولكن أعتقد أنه يمكن أن يساعد الكثير من الناس على أي حال.
لقد جربت الكثير وأكثر الطرق فعالية هو إضافة هذه الأسطر إلى 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+.

بالنسبة إلى Progressbar غير المحدد (Spinner)، قمت فقط بتعيين مرشح اللون على الرسم. يعمل بشكل رائع وخط واحد فقط.

مثال حيث إعداد اللون إلى الأحمر:

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

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

enter image description here

هذا سؤال قديم، ولكن استخدام الموضوع غير مذكور هنا. إذا كان الموضوع الافتراضي الخاص بك يستخدم 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.

جميع 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"/>

وفقا لبعض الاقتراحات، يمكنك تحديد شكل وملفالي مع اللون، ثم تعيينه. لدي هذا العمل برمجيا. هذه هي الطريقة التي أفعلها ..

تأكد أولا من استيراد مكتبة جميلة ..

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

هذا عملت بالنسبة لي:

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

إذا غير محدد:

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

في الوقت الحاضر في عام 2016، وجدت بعض أجهزة ما قبل المصاصة لا تحترم colorAccent الإعداد، لذلك الحل النهائي لجميع واجهات برمجة التطبيقات هو الآن ما يلي:

// 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);
}

للحصول على نقاط المكافأة، لا يستخدم أي رمز مهمل. جربها!

وهذا هو ما فعلته. عمل.

شريط التقدم:

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

progressdrawable.xml:
هنا استخدم التدرج لتغيير اللون كما تريد. و Android: ToDegrees = "x" increse قيمة x و progressbar تدوير بسرعة. انخفاض وتدوير البطيء. تخصيص وفقا لاحتياجاتك.

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

عينة: enter image description here

اضغط على نفس المشكلة أثناء العمل على تعديل مظهر / شعور شريط التقدم الافتراضي. فيما يلي بعض المعلومات التي نأمل أن تساعد الأشخاص :)

  • يجب أن يحتوي اسم ملف XML على أحرف فقط: a-z0-9_. (أي لا عواصم!)
  • للإشارة إلى "الرسم" الخاص بك هو R.drawable.filename
  • لتجاوز المظهر الافتراضي، تستخدم myProgressBar.setProgressDrawable(...), ومع ذلك، لا تحتاج إلى أن تشير فقط إلى تخطيط مخصص الخاص بك R.drawable.filename, تحتاج إلى استرجاعها ك Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
    
  • تحتاج إلى تعيين نمط قبل وضع التقدم / التقدم الثانوي / الحد الأقصى (وضعه بعد ذلك بالنسبة لي أدى إلى شريط تقدم "فارغ")

ربما هناك شيء واحد لم يشار إليه في هذه الإجابة:

إذا كان موضوعك ميراث من Theme.AppCompat, ProgressBar سوف تفترض اللون الذي حددته كما "colorAccent" في موضوعك.

لذلك، باستخدام ..

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

.. تين تينت لون الطوقين الآلي إلى @color/custom_color .

كيف فعلت ذلك في progressbar الأفقي:

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

يمكنك محاولة تغيير أساليبك أو السمات الخاصة بك أو استخدام 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:progressTint="#ffffff" 

أبسط حل إذا كنت ترغب في تغيير اللون في ملف 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" />

عملت هذا الحل بالنسبة لي :

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

شيء صغير آخر، حل الموضوع يعمل إذا ترث موضوع قاعدة، لذلك بالنسبة للتطبيق المدمج يجب أن يكون موضوعك:

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

أرسلت لإضافة معلومات حول إجابة باوليج, ، منذ ateiob طلب مني أن أشرح شيئا ...


أستطيع أن أقول إن هناك (أو على الأقل كان، في وقت كتابة هذا التقرير عندما نظرت إلى هذا الإصدار الحالي من رمز مصدر أندرويد) علة / مشكلة / تحسين في 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، أعتقد أنه كان هناك حل مشابه، لتحديد إزاحة "التقدم" يدويا. في كلتا الحالتين، يجب أن يعمل الكود أعلاه من أجلك.

استخدم ال Android.support.v4.graphics.drawable.drawablecompat.:

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }

بالنسبة إلى الطراز الأفقي 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.

قم بتطبيق هذا النمط المخصص على شريط التقدم.

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

@ جميلة / 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%" />

استخدم هذا النوع من الصور لبار التقدم.enter image description here

للحصول على نتائج أفضل، يمكنك استخدام صور تقدم متعددة. ويرجى عدم التردد في استخدام الصور، لأن منصة أندرويد نفسها تستخدم الصور ل ProgressBar. يتم استخراج الرمز من SDK :)

فيما يلي رمز تغيير لون ProgressBar بالبرنامجي.

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

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);
ProgressBar bar;

private Handler progressBarHandler = new Handler();

GradientDrawable progressGradientDrawable = new GradientDrawable(
        GradientDrawable.Orientation.LEFT_RIGHT, new int[]{
                0xff1e90ff,0xff006ab6,0xff367ba8});
ClipDrawable progressClipDrawable = new ClipDrawable(
        progressGradientDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
Drawable[] progressDrawables = {
        new ColorDrawable(0xffffffff),
        progressClipDrawable, progressClipDrawable};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);


int status = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO Auto-generated method stub
    setContentView(R.layout.startup);

    bar = (ProgressBar) findViewById(R.id.start_page_progressBar);
    bar.setProgress(0);
    bar.setMax(100);

    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    bar.setProgressDrawable(progressLayerDrawable);
}

ساعدني هذا في تعيين لون مخصص إلى ProgressBar من خلال التعليمات البرمجية. آمل أن يساعد

كما اقترح محمد عادل ل SDK Ver 21 وما فوق

android:indeterminateTint="@color/orange"

في XML يعمل بالنسبة لي، سهل بما فيه الكفاية.

إنه سهل الاستخدام للغاية، إذا كنت تتعامل مع تطبيقات Multistyle:

جرب بهذه الطريقة:

أعلن أدناه أسس السمة Attss.xml

 <attr name="circularProgressTheme" format="reference"></attr>

لصق أدناه رمز في أنماط.xml

 <style name="ProgressThemeWhite" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorAccent">#FF0000</item>
    </style>

    <style name="circularProgressThemeWhite">
        <item name="android:theme">@style/ProgressThemeWhite</item>
    </style>


  <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

   <item name="circularProgressTheme">@style/circularProgressThemeWhite</item>

 </style>

استخدم شريط التقدم مثل أدناه

  <ProgressBar
        style="?attr/circularProgressTheme"
        android:id="@+id/commonProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="visible"/>

شريط التقدم الأفقي شريط المواد المخصصة:

لتغيير لون الخلفية والتقدم المحرز في شريط التقدم الأفقي.

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

لتغيير لون 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)
            }
        }
    }
}

وأخيرا عادة تينت ما قبل مصاصة الطربان

tinted progress on api 19

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top