2012-06-08 79 views
27

我有一個progressBar,使用ProgressBar類。通過Android中的CODE ONLY更改進度條顏色

只是在做這樣的:

progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); 

我需要改變一個顏色,使用像這樣的輸入值:

int color = "red in RGB value".progressBar.setColor(color) 

或類似的東西...

我不能使用XML佈局,因爲進度條可爲用戶定製。

回答

15

當我發現一個主題的幫助在這裏,但不記得的聯繫,我張貼我的全解決方案,滿足我的需求的偉大工程:

// Draw a simple progressBar from xml 
    progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); 

    // Convert the color (Decimal value) to HEX value: (e.g: #4b96a0) 
    String color = colorDecToHex(75, 150, 160); 

    // Define a shape with rounded corners 
    final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 
    ShapeDrawable pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners,  null, null)); 

    // Sets the progressBar color 
    pgDrawable.getPaint().setColor(Color.parseColor(color)); 

    // Adds the drawable to your progressBar 
    ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL); 
    progressBar.setProgressDrawable(progress); 

    // Sets a background to have the 3D effect 
    progressBar.setBackgroundDrawable(Utils.getActivity().getResources() 
      .getDrawable(android.R.drawable.progress_horizontal)); 

    // Adds your progressBar to your layout 
    contentLayout.addView(progressBar); 

這裏是十進制的顏色值轉換爲十六進制代碼:

public static String colorDecToHex(int p_red, int p_green, int p_blue) 
{ 
    String red = Integer.toHexString(p_red); 
    String green = Integer.toHexString(p_green); 
    String blue = Integer.toHexString(p_blue); 

    if (red.length() == 1) 
    { 
     red = "0" + red; 
    } 
    if (green.length() == 1) 
    { 
     green = "0" + green; 
    } 
    if (blue.length() == 1) 
    { 
     blue = "0" + blue; 
    } 

    String colorHex = "#" + red + green + blue; 
    return colorHex; 
} 

我認爲最後一種方法並不那麼幹淨,但是效果很好。

希望這個幫助很大,在這個進度條上浪費了太多時間。

+0

幾乎可以工作,但如果你改變進度條的高度,背景可繪製將會太高 – kenyee

13

有可能通過對進度條設置繪製的彩色濾光片上色的進度條:

Drawable drawable = progressBar.getProgressDrawable(); 
drawable.setColorFilter(new LightingColorFilter(0xFF000000, customColorInt)); 
+1

那是什麼我試過了。然而,使用這種方法,顏色有點不可思議...... 事實上,如果我想只具有深灰色背景顏色的顏色:RGB =#5ea618,我應該怎麼做? 因爲如果例如,我在做: new LightingColorFilter(0xFF000000,0xFF5ea618)); progressBar顏色是綠色的,但我看不到它移動。 – hico

+0

如果你想完全控制,你應該自己創建進度條的圖形。 – Moritz

+1

色調都背景和前景 – desgraci

32

這將幫助很多沒有必要做這麼多編碼:)

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

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

只需要一個快速提示,這背景色+前景色和getIndeterminateDrawable()需要如果使用確定的進度條,則更改爲'getProgressDrawable()'。 – JakeSteam

+0

有沒有辦法讓背景顏色變化的前景? – Prakash

6

更新

在Android中(21個作品)的新版本,你可以通過編程方式改變進度的顏色通過僅使用setProgressTintList

要設置紅,用途:

//bar is a ProgressBar 
bar.setProgressTintList(ColorStateList.valueOf(Color.RED)); 
+0

不,它不起作用 –

+0

根據您使用ProgressBar的方式,您可能需要調用'setSecondaryProgressTintList'和/或'setIndeterminateTintList'。 – Cristan

6

這對我的作品與程序兼容性: DrawableCompat.setTint(progressBar.getProgressDrawable(),tintColor);

+0

不,這個色調既背景+前景色... –

+0

這個作品purrrrfect很好!謝謝。它會自動將全色值設置爲主進度並將顏色的透明版本設置爲進度路徑。 – sud007

3

我已經給默認顏色XML通過繪製

我改變了它的編程。

activity_splasg。XML

<ProgressBar 
     android:id="@+id/splashProgressBar" 
     android:progressDrawable="@drawable/splash_progress_drawable" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:max="100" 
     android:progress="50" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_alignParentBottom="true" /> 

splash_progress_drawable.xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@android:id/background"> 
     <shape> 
      <solid 
       android:color="@android:color/transparent" /> 
     </shape> 
    </item> 

    <item 
     android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <solid 
        android:color="#e5c771" /> 
      </shape> 
     </clip> 
    </item> 

</layer-list> 

現在如何改變ProgressDrawable顏色編程

ProgressBar splashProgressBar = (ProgressBar)findViewById(R.id.splashProgressBar); 

Drawable bgDrawable = splashProgressBar.getProgressDrawable(); 
bgDrawable.setColorFilter(Color.BLUE, android.graphics.PorterDuff.Mode.MULTIPLY); 
splashProgressBar.setProgressDrawable(bgDrawable); 

希望這會幫助你。

+1

不,程序化的解決方案將色彩背景+前景顏色... –

1

progressbar.setIndeterminateTintList(ColorStateList.valueOf(Color.RED));

它僅適用於上述API 21

9

在你需要對背景進行着色,並以不同的顏色進度條的情況。

progress_drawable.xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@android:id/background"> 
     <shape android:shape="rectangle" > 
      <solid android:color="@color/white" /> 
     </shape> 
    </item> 
    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <solid android:color="@color/green" /> 
      </shape> 
     </clip> 
    </item> 
</layer-list> 

及其可能的,以編程,以它的元分解層列表項和分別着色它們:

LayerDrawable progressBarDrawable = (LayerDrawable) progressBar.getProgressDrawable(); 
Drawable backgroundDrawable = progressBarDrawable.getDrawable(0); 
Drawable progressDrawable = progressBarDrawable.getDrawable(1); 

backgroundDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.white), PorterDuff.Mode.SRC_IN); 
progressDrawable.setColorFilter(ContextCompat.getColor(this.getContext(), R.color.red), PorterDuff.Mode.SRC_IN); 
+0

我用這個解決方案,但用'DrawableCompat.setTint()'而不是'setColorFilter()',它工作得很好。這是我找到的唯一方法,所以背景顏色也不會改變。 – Franco

0

佈局= activity_main.xml中:

<ProgressBar 
    android:id="@+id/circle_progress_bar_middle" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerInParent="true" 
    android:max="100" 
    android:rotation="-90" 
    android:indeterminate="false" 
    android:progressDrawable="@drawable/my_drawable_settings2" /> 

在Java Activity/Fragment:

ProgressBar myProgressBar = (ProgressBar) view.findViewById(R.id.circle_progress_bar_middle); 
myProgressBar.setProgressDrawable(getResources().getDrawable(R.my_drawable_settings1)); 

您繪製/紋理貼圖文件夾中的文件my_drawable_settings1.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:id="@android:id/progress"> 
     <shape 
      android:innerRadius="55dp" 
      android:shape="ring" 
      android:thickness="9dp" 
      android:useLevel="true"> 

      <gradient 
       android:startColor="#3594d1" 
       android:endColor="@color/white" 
       android:type="sweep" /> 
     </shape> 
    </item> 
</layer-list> 

凡my_drawable_settings1和my_drawable_settings2.xml具有不同的顏色。

-1

,如果你想改變進度條的顏色編程,那麼你複製過去的這個代碼,它正在100%

mainProgressBar.getIndeterminateDrawable().setColorFilter(Color.GREEN, PorterDuff.Mode.MULTIPLY); 
+0

不適合我 –