Android更改水平进度条颜色

时间:2011-04-21 14:54:24

标签: android colors progress-bar android-progressbar

我已设置水平进度条。

我想改变黄色的进度颜色。

<ProgressBar 
    android:id="@+id/progressbar" 
    android:layout_width="80dip" 
    android:layout_height="20dip"  
    android:focusable="false" 
    style="?android:attr/progressBarStyleHorizontal" />

问题是,不同设备的进度颜色不同。 所以,我希望它能修复进度颜色。

18 个答案:

答案 0 :(得分:340)

我从我的一个应用程序中复制了这个,所以有一些额外的属性,但应该给你一个想法。这是来自具有进度条的布局:

<ProgressBar
    android:id="@+id/ProgressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:maxHeight="10dip"
    android:minHeight="10dip"
    android:progress="50"
    android:progressDrawable="@drawable/greenprogress" />

然后创建一个类似于以下内容的新drawable(在本例中为greenprogress.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>
        <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="#33FF33"
                android:endColor="#008000"
                android:angle="270" />
        </shape>
    </clip>
</item>

</layer-list>

您可以根据需要更改颜色,这将为您提供绿色进度条。

答案 1 :(得分:94)

更简单的解决方案:

progess_drawable_blue

<?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="@color/disabled" />
    </shape>
</item>

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

</layer-list>

答案 2 :(得分:34)

如果您只想更改进度条颜色,可以在Activity的onCreate()方法中使用颜色过滤器:

ProgressBar progressbar = (ProgressBar) findViewById(R.id.progressbar);
int color = 0xFF00FF00;
progressbar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressbar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);

来自here的想法。

您只需要为棒棒糖前版本执行此操作。在Lollipop上,您可以使用colorAccent样式属性。

答案 3 :(得分:31)

只需在values/styles.xml中创建一个样式。

<style name="ProgressBarStyle">
    <item name="colorAccent">@color/greenLight</item>
</style>

然后将此样式设置为ProgressBar主题。

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

并且无论您的进度条是水平还是圆形。 就是这样。

答案 4 :(得分:5)

有三种方法可以解决这个问题:

  1. 如何以声明方式调整进度条颜色
  2. 如何以编程方式调整进度条颜色,但从编译时间之前声明的各种预定颜色中选择颜色
  3. 如何以编程方式调整进度条颜色,并以编程方式创建颜色。
  4. 特别是围绕#2和#3存在很多混淆,正如对amfcosta答案的评论所示。当你想要将进度条设置为除原色之外的任何东西时,该答案将产生不可预测的颜色结果,因为它仅修改背景颜色,并且实际进度条“剪辑”区域仍将是具有降低的不透明度的黄色叠加。例如,使用该方法将背景设置为深紫色将导致进度条“剪辑”颜色呈现出一些疯狂的粉红色,这是由于暗紫色和黄色混合通过减少的alpha而产生的。

    所以无论如何,#1完全被Ryan回答,而Štarke回答了#3的大部分内容,但对于那些寻找#2和#3的完整解决方案的人来说:

    如何以编程方式调整进度条颜色,但从XML中声明的预定颜色中选择颜色

    <强> RES /抽拉/ my_progressbar.xml

    创建此文件,但更改my_progress和my_secondsProgress中的颜色:

    (注意:这只是定义默认android SDK ProgressBar的实际XML文件的副本,但我更改了ID和颜色。原文名为progress_horizo​​ntal)

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:id="@+id/my_progress_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="@+id/my_secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:startColor="#80ff171d"
                    android:centerColor="#80ff1315"
                    android:centerY="0.75"
                    android:endColor="#a0ff0208"
                    android:angle="270"
                    />
            </shape>
        </clip>
    </item>
    
    <item android:id="@+id/my_progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:startColor="#7d2afdff"
                    android:centerColor="#ff2afdff"
                    android:centerY="0.75"
                    android:endColor="#ff22b9ba"
                    android:angle="270"
                    />
            </shape>
        </clip>
    </item>
    

    在您的Java中

    final Drawable drawable;
    int sdk = android.os.Build.VERSION.SDK_INT;
        if(sdk < 16) {
            drawable =  ctx.getResources().getDrawable(R.drawable.my_progressbar);
        } else {
            drawable = ContextCompat.getDrawable(ctx, R.drawable.my_progressbar);
        }
    progressBar.setProgressDrawable(drawable)
    

    如何以编程方式调整进度条颜色,并以编程方式创建颜色

    编辑:我找到了解决这个问题的时间。我以前的回答让这有点模棱两可。

    ProgressBar由LayerDrawable中的3个Drawable组成。

    1. 第1层是背景
    2. 第2层是次要进度颜色
    3. 第3层是主要进度条颜色
    4. 在下面的示例中,我将主进度条的颜色更改为青色。

      //Create new ClipDrawable to replace the old one
      float pxCornerRadius = viewUtils.convertDpToPixel(5);
      final float[] roundedCorners = new float[] { pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius };
      ShapeDrawable shpDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));
      shpDrawable.getPaint().setColor(Color.CYAN);
      final ClipDrawable newProgressClip = new ClipDrawable(shpDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
      
      //Replace the existing ClipDrawable with this new one
      final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
      layers.setDrawableByLayerId(R.id.my_progress, newProgressClip);
      

      该示例将其设置为纯色。您可以通过替换

      将其设置为渐变颜色
      shpDrawable.getPaint().setColor(Color.CYAN);
      

      Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
      shpDrawable.getPaint().setShader(shader);
      

      干杯。

      -Lance

答案 5 :(得分:3)

通过Material Components Library,您可以将 LinearProgressIndicator app:indicatorColor 属性一起使用以更改颜色:

  <com.google.android.material.progressindicator.LinearProgressIndicator
      app:indicatorColor="@color/..."
      app:trackThickness="..."
      app:trackColor="@color/..."
      />

enter image description here

注意:它至少需要版本1.3.0-alpha04

使用 ProgressBar ,您可以使用以下方法覆盖颜色:

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

具有:

<style name="CustomProgressBarTheme">
    <item name="colorAccent">@color/primaryDarkColor</item>
</style>

enter image description here

答案 6 :(得分:2)

我发现的最简单的解决方案是这样的:

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

将上述内容放在styles.xml文件夹下的res > values文件中。

注意:如果您使用任何其他强调色,那么以前的解决方案应该很好用。

API 21或更高

答案 7 :(得分:2)

对于任何想要以编程方式进行操作的人来说:

    Drawable bckgrndDr = new ColorDrawable(Color.RED);
    Drawable secProgressDr = new ColorDrawable(Color.GRAY);
    Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1);
    LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr });
    //setting ids is important
    resultDr.setId(0, android.R.id.background);
    resultDr.setId(1, android.R.id.secondaryProgress);
    resultDr.setId(2, android.R.id.progress);

将ids设置为drawable是至关重要的,并负责保留边界和实际进度状态栏

答案 8 :(得分:1)

只需将public class MainActivity extends AppCompatActivity { private static final int RC_SIGN_IN = 1; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthStateListener; private TextView mUserNameTextView; private Button mSignOutButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUserNameTextView = (TextView) findViewById(R.id.user_name_text_view); mSignOutButton = (Button) findViewById(R.id.sign_out_button); mAuth = FirebaseAuth.getInstance(); FirebaseUser user = mAuth.getCurrentUser(); mAuthStateListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // User is signed in mUserNameTextView.setText(user.getDisplayName()); } else { // User is signed out startActivityForResult( AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(Arrays.asList( new AuthUI.IdpConfig.EmailBuilder().build(), new AuthUI.IdpConfig.GoogleBuilder().build())) .build(), RC_SIGN_IN); } } }; mSignOutButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signOut(); } }); } private void signOut() { FirebaseAuth.getInstance().signOut(); mUserNameTextView.setText(""); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { if (resultCode == RESULT_OK) { // Sign-in succeeded, set up the UI Toast.makeText(this, "Signed in!", Toast.LENGTH_SHORT).show(); } else if (resultCode == RESULT_CANCELED) { // Sign in was canceled by the user, finish the activity Toast.makeText(this, "Sign in canceled", Toast.LENGTH_SHORT).show(); finish(); } } } @Override protected void onPause() { super.onPause(); if (mAuthStateListener != null) { // when app is paused remove the state listener mAuth.removeAuthStateListener(mAuthStateListener); } } @Override protected void onResume() { super.onResume(); // adding the state listener mAuth.addAuthStateListener(mAuthStateListener); } } 添加到您的progressBar

示例:

android:indeterminateTint="@color/colorPrimary"

如果progressBarStyleHorizo​​ntal为<ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateTint="@color/colorPrimary"/>

示例:

android:progressTint="@color/colorPrimary"

答案 9 :(得分:1)

如果您的API级别为21或更高,则可以使用以下XML属性:

<!-- For indeterminate progress bar -->
android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
android:progressTint="@color/white"

答案 10 :(得分:1)

ProgressBar颜色可以更改如下:

/res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorAccent">#FF4081</color>
</resources>

/res/values/styles.xml

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

的onCreate:

progressBar = (ProgressBar) findViewById(R.id.progressBar);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    Drawable drawable = progressBar.getIndeterminateDrawable().mutate();
    drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.SRC_IN);
    progressBar.setIndeterminateDrawable(drawable);
}

答案 11 :(得分:1)

你们真的让我头疼。 您可以做的是使您的图层列表首先通过xml绘制(表示背景作为第一层,一个drawable表示次要进度作为第二层,另一个drawable表示主要进度为最后一层),然后通过执行以下操作更改代码上的颜色:

public void setPrimaryProgressColor(int colorInstance) {
      if (progressBar.getProgressDrawable() instanceof LayerDrawable) {
        Log.d(mLogTag, "Drawable is a layer drawable");
        LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of android.R.id.progress>);
        circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
        progressBar.setProgressDrawable(layered);
    } else {
        Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
        progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
}

此方法将为您提供最佳的灵活性,可以在xml上声明原始drawable的测量结果,之后不会对其结构进行修改,特别是如果您需要具有特定的xml文件屏幕文件夹,那么只需修改通过代码颜色。无需从头开始重新实例化新的ShapeDrawable。

答案 12 :(得分:0)

以上答案会改变整个背景颜色,并且它将进度条的高度更改为非常大的ambigios,它无法在xml中更改。 更改方式仅更改进度条状态,即完成多少i.s 20%红色,50%黄色70%以上绿色。你可以用Java编程。

如果您有任何其他解决方案,

分享您的答案。

答案 13 :(得分:0)

根据需要的背景创建可绘制资源,在我的情况下,我将其命名为bg_custom_progressbar.xml

<?xml version="1.0" encoding="utf-8"?>

<item>
    <shape android:shape="rectangle" >
        <corners android:radius="5dp"/>

        <gradient
            android:angle="180"
            android:endColor="#DADFD6"
            android:startColor="#AEB9A3" />
    </shape>
</item>
<item>
    <clip>
        <shape android:shape="rectangle" >
            <corners android:radius="5dp" />

            <gradient
                android:angle="180"
                android:endColor="#44CF4A"
                android:startColor="#2BB930" />
        </shape>
    </clip>
</item>
<item>
    <clip>
        <shape android:shape="rectangle" >
            <corners android:radius="5dp" />

            <gradient
                android:angle="180"
                android:endColor="#44CF4A"
                android:startColor="#2BB930" />
        </shape>
    </clip>
</item>

然后使用

这样的自定义背景
 <ProgressBar
                android:id="@+id/progressBarBarMenuHome"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:layout_marginStart="10dp"
                android:layout_marginEnd="10dp"
                android:layout_marginBottom="6dp"
                android:indeterminate="false"
                android:max="100"
                android:minWidth="200dp"
                android:minHeight="50dp"
                android:progress="10"
                android:progressDrawable="@drawable/bg_custom_progressbar" />

对我来说很好

答案 14 :(得分:0)

在xml中:

equals()

ViewModel:

<ProgressBar
                    android:id="@+id/progressBar"
                    style="?android:attr/progressBarStyleInverse"
                    android:layout_width="60dp"
                    android:layout_height="60dp"
                    android:layout_margin="@dimen/dimen_10dp"


                 android:indeterminateTint="@{viewModel.getComplainStatusUpdate(position)}"
                    android:indeterminate="true"
                    android:indeterminateOnly="false"
                    android:max="100"
                    android:clickable="false"
                    android:indeterminateDrawable="@drawable/round_progress"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

答案 15 :(得分:0)

如果您要在Android中以编程方式将主要和次要进度颜色设置为水平进度条,请使用以下代码段

product count * 20

答案 16 :(得分:0)

您可以使用自定义绘图工具使进度栏样式化。创建一个可绘制的文件

progress_user_badge.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">
            <corners android:radius="@dimen/_5sdp"/>
            <solid android:color="@color/your_default_color" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/_5sdp"/>
                <solid android:color="@color/your_exact_color" />
            </shape>
        </clip>
    </item>

</layer-list>

现在在您的小部件中使用此可绘制文件

<ProgressBar
    android:id="@+id/badge_progress_bar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="@dimen/_200sdp"
    android:layout_height="@dimen/_7sdp"
    android:layout_gravity="center"
    android:layout_marginTop="@dimen/_15sdp"
    android:indeterminate="false"
    android:max="100"
    android:progress="70"
    android:progressDrawable="@drawable/progress_user_badge"/>

您可以使用波纹管以编程方式更改进度栏的进度颜色

badge_progress_bar.progressTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.your_color))

答案 17 :(得分:0)

最终的LayerDrawable layers =(LayerDrawable)progressBar.getProgressDrawable(); layers.getDrawable(2).setColorFilter(颜色,PorterDuff.Mode.SRC_IN);