एंड्रॉइड में प्रगति बार की प्रगति रंग कैसे बदलें


473

मैं अपने Android एप्लिकेशन में एक क्षैतिज प्रगति पट्टी का उपयोग कर रहा हूं, और मैं इसका प्रगति रंग बदलना चाहता हूं (जो डिफ़ॉल्ट रूप से पीला है)। मैं इसका उपयोग कैसे कर सकता हूं code(XML नहीं)?


क्या आपने MyProgressBar.setProgressDrawable (ड्रा करने योग्य d) को अपने इच्छित रंग के साथ बिटमैप निर्दिष्ट करने का प्रयास किया है? developer.android.com/reference/android/widget/... developer.android.com/reference/android/graphics/drawable/...
fupsduck

2
हाँ, मैंने कोशिश की है, लेकिन यह काम नहीं करता है। यह केवल बार के ही बैकग्राउंड कलर को सेट करने के बजाय पूरे प्रोग्रेस बार व्यू का बैकग्राउंड कलर सेट करता है। धन्यवाद।
वाइटटाइगरके

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
इसका कारण यह है कि मैं प्रगति बार को गतिशील रूप से बना रहा हूं, और उपयोगकर्ता के अनुरोध पर इसका रंग सेट कर रहा हूं। चूंकि मैं आमतौर पर अपने GUI स्क्रीन और घटकों के निर्माण के लिए कोड का उपयोग करता हूं, मैं संलग्न XML से परिचित नहीं हूं और मुझे नहीं पता कि एक परत-सूची क्या है (हालांकि मैं अनुमान लगा रहा हूं कि आप कई परतों के आधार पर प्रगति पट्टी का निर्माण कर रहे हैं ..)। मामले में मैं आपके द्वारा संलग्न XML का उपयोग करना चाहता हूं - मुझे इसे प्रोजेक्ट के फ़ोल्डर में कहां रखना चाहिए और क्या XML सेटिंग्स के आधार पर प्रगति पट्टी बनाने के लिए मुझे कुछ और करने की आवश्यकता है? धन्यवाद।
व्हाइटटाइगरके

1
आप इस xml को एक फ़ाइल के रूप में सहेजते हैं और इसे ड्रा करने योग्य फ़ोल्डर में डालते हैं (मान लें कि my_progress.xml) की तुलना में आपने इसे MyProgressBar.setProgressDrawable () रंग बदलने के लिए एक ड्रॉबल के रूप में सेट किया है - आपको उन मूल्यों को @ रंग / में बदलने की आवश्यकता होगी प्रगति_स्टार्ट @ रंग / प्रगति_ यह मूल रूप से एक ढाल है और आप वहां हेक्स लगा सकते हैं।
एलेक्स वोलोवॉय

3
नोट - फाइल एसडीके में एक की कॉपी है। मैंने यहां कॉपीराइट गिरा दिया है। यदि आप res / drawable फ़ोल्डर में देखते हैं, तो आपको वही दिखाई देगा जो मैंने पोस्ट किया है - रंग कस्टम रंग के बजाय, पीले रंग के ढाल पर सेट हैं।
एलेक्स वोलोवॉय

7
यह मेरे लिए कोई रंग परिवर्तन नहीं दिखाता है। कृपया बताएं कि किस रंग ने काम किया।
प्रवीण

हाय एलेक्स, आपके उत्तर बहुत अच्छे हैं। लेकिन, मुझे रनटाइम पर कस्टम प्रगति पहिया रंग बदलने की कोशिश की जा रही है। पर में नहीं कर सका। कृपया मेरी समस्या को हल करने में मेरी मदद करें .. प्रगति तक पहुँचने के बाद 100%, फिर उस समय का रंग बदलें और प्रगति शुरू करें .. इस से कोड डाउनलोड करें .. stackoverflow.com/questions/18503718/…
harikrishnan

485

एक क्षैतिज प्रोग्रेसबार के लिए, आप इसका उपयोग कर सकते हैं ColorFilter, जैसे:

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

रंग फिल्टर का उपयोग करते हुए रेड प्रोग्रेसबार

नोट: यह आपके ऐप में सभी प्रगति सलाखों की उपस्थिति को संशोधित करता है। केवल एक विशिष्ट प्रगति पट्टी को संशोधित करने के लिए, यह करें:

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

अगर प्रगतिबार अनिश्चित है तो getIndeterminateDrawable()इसके बजाय उपयोग करें getProgressDrawable()

लॉलीपॉप (एपीआई 21) के बाद से आप एक प्रगति टिंट सेट कर सकते हैं:

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

प्रगति प्रगति का उपयोग कर लाल प्रगति


7
मैं इस उत्तर का उपयोग करना चाहता था क्योंकि यह मुझे सबसे सरल लगता था लेकिन मेरी प्रगति पट्टी स्वतंत्र रूप से प्रगति मूल्य से पूरी तरह लाल है। क्या आप मोड का उपयोग करने के लिए सुनिश्चित हैं?
एलजी

33
@्रेसस मैं एक ही समस्या है, बार पूरी तरह से लाल था और कोई प्रगति नहीं दिख रही थी। लेकिन मैंने इसे हल कर दिया है। मोड में बदलकर। मोड में केवल।
डेरज़ू

40
getIndeterminateDrawableयदि आप अनिश्चित प्रगति का उपयोग कर रहे हैं , तो इसे करना न भूलें ।
टॉमी

6
सलाह दी जाती है, इस संदर्भ में 'मोड' android.graphics.PorterDuff.Mode को संदर्भित करता है
1owk3y

9
पृष्ठभूमि का रंग कैसे न बदलें? मैं सिर्फ प्रगति रंग बदलना चाहता हूं।
kangear

364

यह प्रोग्राम नहीं है, लेकिन मुझे लगता है कि यह वैसे भी बहुत से लोगों की मदद कर सकता है।
मैंने बहुत कोशिश की और सबसे कुशल तरीका यह था कि मैं अपने प्रोग्रेसबार को .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
न्यूनतम एपीआई स्तर 21 की आवश्यकता है
Apfelsaft

इन गुणों के लिए सेटर विधियां भी हैं जिन्हें कहा जा सकता है यदि गतिशील रंग निर्धारित किया जाना चाहिए।
दौड़

क्या मुझे api 21+ और api = 20 के लिए एक कस्टम संसाधन फ़ाइल बनानी होगी? या क्या उन विशेषताओं को केवल एपि = 20 में अनदेखा किया गया है?
प्रॉम 85

1
@ श्रीदत्तकोठारी यह सबसे अच्छा कैसे हो सकता है? ... यह 21+ से
user25

2
एंड्रॉइड के रूप में सबसे अच्छा जवाब 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.getIndeterminateDableable ()। setColorFilter (new lightColorFilter (0xFF000000, frontgroundCarDesired));
कला गीगेल

4
यह भी ध्यान दें कि ऐसा करने से आपके ऐप में सभी प्रगति पट्टियों के ड्राफ़्ट संशोधित होंगे। केवल किसी विशेष के लिए ऐसा करने के लिए, ड्रा करने योग्य पर म्यूट () कॉल करें, फिर उस पर रंग फ़िल्टर सेट करें और फिर सेट करें। InInermermDDable को अपनी प्रगति पर कॉल करें।
dimsuz

3
NB: जो लोग इसका इस्तेमाल करते हैं और सोच रहे हैं कि उनका रंग ठीक वैसा नहीं दिखता जैसा कि वे जिस हेक्स स्ट्रिंग में डालते हैं, उस पर मल्टीपल कलर फिल्टर होता है। बदलें android.graphics.PorterDuff.Mode.MULTIPLYकरने के लिए PorterDuff.Mode.SRC_INऔर आप सटीक हेक्स रंग मिल जाएगा।
माइक्रूजिन

मुझे लगता है कि उसे बस इस जवाब की आवश्यकता है ..... Android: indeterminateTint = "@ android: color / black"
मुहम्मद आदिल

4
मैं के रूप में इस्तेमाल किया: progressBar = (ProgressBar) findViewById (R.id.progressBar); प्रगतिबेर.गेटइंडमीनेटडाइरेबल ()। सेटऑनलाइनफिल्टर (कॉन्टेक्स्ट कॉमपॉट.गेटकॉलर (यह, android.R.color.white), android.graphics.PorterDuff.Mode.lineIPLY);
आशीषधिमान २००

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 का उपयोग नहीं करते हैं, कई उपयोगकर्ता एपीआई 21+ के समाधान के साथ वोट-अप जवाब देते हैं, बिल्कुल भी अच्छा नहीं है, उन्हें अधिक से अधिक उपकरणों / ओएस का समर्थन करना चाहिए
user25

1
बहुत बढ़िया! मेरे लिए काम किया है, लेकिन मुझे यह सुनिश्चित करना था कि कहीं एक माता-पिता = "@ शैली / Theme.AppCompat" था कहीं और शैली पदानुक्रम में मेरे पास एक और माता-पिता थे और यह पहले काम नहीं करता था।
नूब्लोडेवलप्टर

@Nublodeveloper हाँ मैंने उल्लेख किया है कि पहली पंक्ति में अगर आपने ध्यान दिया हो।
कीर्तन403

1
@ kirtan403 आह, हाँ, मुझे यह मिल गया है अब आप इसका उल्लेख करते हैं, लेकिन मैं इसे उस तरह नहीं समझ पाया जब मैंने पहली बार इसे पढ़ा था। मैंने इसे बहुत तेजी से पढ़ा और मुझे कोड की तलाश थी। वैसे भी धन्यवाद, आपका जवाब मेरे लिए सबसे अच्छा है!
न्युब्लोडेवलर

+1 आपका समाधान पसंद आया। लेकिन जावा में थीम का रंग कैसे सेट करें ??? उदाहरण के लिए मैं चाहता हूँ अगर यह <रंग नाम = "red"> # ff5900 </ रंग> लाल होने के लिए
Maseed

54

सभी एपीआई

अगर सभी API का उपयोग करें तो स्टाइल में थीम बनाएं

style.xml

<resources>

    //...

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

</resources>

और प्रगति में उपयोग करें

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

एपीआई स्तर 21 और उच्चतर

यदि एपीआई स्तर 21 में उपयोग किया जाता है और उच्चतर इस कोड का उपयोग करते हैं:

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

1
अच्छा, मुझे लगता है कि style.xml विधि सबसे अच्छी है। (20 एपी से ऊपर की आवश्यकता नहीं)
iamkdblue

1
सबसे अच्छा समाधान यदि आप सभी एपीआई के लिए एक समाधान चाहते हैं धन्यवाद :)
नवीन

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
मैंने ऊपर दिए गए कोड की कोशिश की, दुर्भाग्य से यह सिर्फ एक "खाली" प्रगति बार में परिणाम है। क्या मैं कुछ भूल रहा हूँ?
ओशनब्लू

आपको ClipDrawable पर setLevel पर कॉल करना होगा। यह 0 से 10000 तक मान लेता है। इसलिए, प्रगति .setLevel (2500) 25% पूर्ण होगी।
HappyEngineer

1
मैंने उस उत्तर को संपादित किया है जो एक "खाली" प्रगति बार के लिए एक कारण बताता है - और इसे ठीक करने के 2 तरीके (incl @ HappyEngineer's fix)
रिचर्ड ले

@RichardLeMesurier आप टिप्पणी अनुभाग में स्पष्टीकरण + 2 तरीके पोस्ट कर सकते हैं? progress.setLevel(2500)मेरे लिए काम नहीं करता है और जाहिरा तौर पर आपका संपादन किसी कारण से स्वीकार नहीं किया गया था। धन्यवाद। +1।
एटियोब


32

यह मेरे लिए काम किया:

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

12
केवल एपीआई स्तर 21 और उच्चतर में उपयोग किया जाता है
न्यूमैर

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 sample ऐप में लागू किया है । मैंने पाया है कि इस समाधान के लिए मूल विषय अपेक्षित नहीं है। parent="ThemeOverlay.AppCompat.Light"
एडम हर्विट्ज

23

आजकल 2016 में मैंने पाया कि कुछ प्री-लॉलीपॉप डिवाइस 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));
तरसेम सिंह

एंड्रॉइड किटकैट 4.4.2 पर काम नहीं कर रहा है।
प्रदीप तिलला

बस एक नए नए 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"
           />

उत्तरोत्तर। 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>

.. प्रगति के रंग को स्वचालित रूप से रंग दें @color/custom_color


1
मुझे <आइटम नाम = "Android: colorAccent"> @ रंग / हाइलाइट </ आइटम> का उपयोग करने की आवश्यकता है
टन


15

आप अपनी शैलियाँ, विषय-वस्तु या एंड्रॉइड का उपयोग करने की कोशिश कर सकते हैं: indeterminateTint = "@ color / yourColor" कहीं भी आप चाहें, लेकिन वहाँ सिर्फ एक ही रास्ता ओ कर रहा है जो किसी भी एंड्रॉइड 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 );

यह दुख की बात है कि एंड्रॉइड एक गड़बड़ है!


धन्यवाद! यह अनिश्चित के लिए काम करता है ProgressBar, लेकिन यह निर्धारित करने के लिए रंग के साथ पूरे पैमाने पर पेंट करता है।
CoolMind

14

मैंने इसे क्षैतिज प्रगति में कैसे किया:

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

2
मैंने एक ही काम किया, साथ ही बैकग्राउंड का रंग बदला: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
कामेन डोबरेव

1
@KamenDobrev की टिप्पणी के साथ यह उत्तर केवल वही है जो वास्तव में मुझे चाहिए था। जब मैंने केवल प्रगति के लिए एक रंगीन फ़िल्टर निर्धारित किया, तो पृष्ठभूमि का रंग भी बदल गया।
m_katsifarakis

13

सरलतम समाधान यदि आप लेआउट xml फ़ाइल में रंग बदलना चाहते हैं, तो नीचे दिए गए कोड का उपयोग करें और अपने इच्छित रंग के लिए अनिश्चित संपत्ति का उपयोग करें।

    <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

क्षैतिज प्रगति रंग बदलने के लिए (कोटलिन में):

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

अनिश्चितकालीन प्रगति रंग बदलने के लिए:

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

और यह अंत में आम तौर पर प्री-लॉलीपॉप प्रोग्रेसबार टिंट करता है

अप्रैल 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
इसके लिए न्यूनतम एपीआई स्तर 21
शिहाब उद्दीन

6

पॉलिए के जवाब के बारे में जानकारी जोड़ने के लिए पोस्ट किया गया , क्योंकि एटिएब ने मुझे कुछ समझाने के लिए कहा था ...


मैं कह सकता हूं कि (या कम से कम था, लेखन के समय जब मैंने एंड्रॉइड स्रोत कोड के उस वर्तमान संस्करण को देखा) कोड में एक बग / मुद्दा / अनुकूलन 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 के समाधान की बात है, मुझे लगता है कि यह मैन्युअल रूप से "प्रगति" ऑफसेट सेट करने के लिए एक समान वर्कअराउंड था। किसी भी स्थिति में, उपरोक्त कोड आपके लिए काम करना चाहिए।


धन्यवाद..यह वास्तव में काम करता है..लेकिन जैसा कि मेरा ड्राबल स्थिर था (संसाधनों से) .. यह काम नहीं किया। मैंने केवल "drawable.invalidateSelf ();" 'सेटप्रोग्रेड (0)' और 'सेटप्रोग्रेसडेबल (
आकर्षित करने


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

एक क्षैतिज शैली के लिए प्रगतिशील I का उपयोग करें:

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

यदि आपको 'माध्यमिक प्रगति' की आवश्यकता नहीं है, तो value2 को value1 पर सेट करें।


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>

@ ड्रॉबल / प्रोग्रेस। 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%" />

प्रगति बार के लिए इस प्रकार की छवि का उपयोग करें। यहाँ छवि विवरण दर्ज करें

बेहतर परिणाम के लिए आप कई प्रगति चित्रों का उपयोग कर सकते हैं। और कृपया छवियों का उपयोग करने में संकोच न करें, क्योंकि एंड्रॉइड प्लेटफॉर्म खुद प्रगतिबार के लिए छवियों का उपयोग करता है। कोड sdk से निकाला जाता है :)


4

जैसा कि मुहम्मद-आदिल ने एसडीके को 21 और उससे अधिक के लिए सुझाव दिया था

android:indeterminateTint="@color/orange"

मेरे लिए XML वर्क्स में, काफी आसान है।


यदि आप पूरे ऐप के लिए बदलना चाहते हैं, तो कृपया <color name = "RedAccent"> # FE6C27 </ color> का मान बदलें। अपने मान / रंग में। xml।
मुगिल

4

यहाँ प्रोग्राम द्वारा प्रगतिशील रंग बदलने के लिए कोड है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.