programing

Android에서 ProgressBar의 진행률 표시기 색상을 변경하는 방법

lastmoon 2023. 7. 31. 21:50
반응형

Android에서 ProgressBar의 진행률 표시기 색상을 변경하는 방법

수을설습니다했정평▁로 설정했습니다.ProgressBar.

진행 색상을 노란색으로 변경하고 싶습니다.

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

문제는 기기마다 진행 색상이 다르다는 것입니다.그래서 진행 색상을 수정해주셨으면 합니다.

저는 이것을 제 앱 중 하나에서 복사했습니다. 그래서 몇 가지 추가적인 속성이 있을 수 있지만, 아이디어를 제공해야 합니다.다음은 진행률 표시줄이 있는 레이아웃입니다.

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

그런 다음 다음과 유사한 것으로 새 그림 그리기 테이블을 만듭니다(이 경우).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:angle="270"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:startColor="#ff9d9e9d" />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:angle="270"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:startColor="#80ffd300" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                    android:angle="270"
                    android:endColor="#008000"
                    android:startColor="#33FF33" />
            </shape>
        </clip>
    </item>

</layer-list>

필요에 따라 색상을 변경할 수 있습니다. 그러면 녹색 진행 표시줄이 나타납니다.

더 간단한 솔루션:

진행_그림그리기_파란색

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

타일을작성다로 스타일을 .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"/>

진행 표시줄이 수평이거나 원형인 것은 중요하지 않습니다.이상입니다.

API 레벨 21 이상의 경우 그냥 사용합니다.

android:progressBackgroundTint="@color/yourBackgroundColor"
android:progressTint="@color/yourColor"

진행 표시줄 색상만 변경하려는 경우, 활동의 작성() 방법에서 색상 필터를 사용하면 됩니다.

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

여기서 나온 아이디어.

롤리팝 이전 버전의 경우에만 이 작업을 수행하면 됩니다.롤리팝에서 colorAccent 스타일 속성을 사용할 수 있습니다.

재료 구성요소 라이브러리를 사용하여 특성과 함께 를 사용하여 색상을 변경할 수 있습니다.

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

enter image description here

참고: 버전 이상이 필요합니다.1.3.0-alpha04.

에서는 다음을 사용하여 색상을 재정의할 수 있습니다.

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

포함:

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

enter image description here

이 문제를 해결하는 방법은 세 가지가 있습니다.

  1. 진행률 표시줄 색상을 선언적으로 조정하는 방법
  2. 프로그래밍 방식으로 진행 표시줄 색을 조정하지만 컴파일 시간 전에 선언된 다양한 미리 결정된 색 중에서 색을 선택하는 방법
  3. 진행 표시줄 색을 프로그래밍 방식으로 조정하고 색을 프로그래밍 방식으로 만드는 방법.

특히 amfcosta의 답변에 대한 댓글에서 볼 수 있듯이 #2와 #3 주변에 많은 혼란이 있습니다.이 대답은 배경색만 수정하므로 진행 표시줄을 기본 색상을 제외한 다른 색상으로 설정할 때마다 예측할 수 없는 색상 결과를 생성하며, 실제 진행 표시줄 "클립" 영역은 여전히 불투명도가 감소된 노란색 오버레이가 됩니다.예를 들어, 이 방법을 사용하여 배경을 진한 보라색으로 설정하면 알파를 통해 진한 보라색과 노란색이 혼합되어 비정상적인 분홍색의 진행 표시줄 "클립" 색상이 생성됩니다.

따라서 어쨌든 #1은 Ryan이 완벽하게 답하고 Shtarke는 #3의 대부분을 답하지만 #2와 #3에 대한 완벽한 해결책을 찾는 사람들에게는 다음과 같습니다.


진행률 표시줄 색상을 프로그래밍 방식으로 조정하지만 XML로 선언된 미리 결정된 색상 중에서 색상을 선택하는 방법

res/drawable/my_drawablebar.xml:

이 파일을 만들지만 my_progress 및 my_secondsProgress에서 색상을 변경합니다.

(참고: 기본 Android SDK ProgressBar를 정의하는 실제 XML 파일의 복사본이지만 ID와 색상을 변경했습니다.원본의 이름은 progress_horizontal)입니다.

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

진행률 표시줄 색을 프로그래밍 방식으로 조정하고 색을 프로그래밍 방식으로 만드는 방법

편집: 이 문제를 제대로 해결할 시간을 찾았습니다.저의 이전 답변은 이것을 약간 모호하게 남겼습니다.

진행률 표시줄은 도면층 그리기 테이블에서 그리기 가능한 3개로 구성됩니다.

  1. 계층 1이 배경입니다.
  2. 레이어 2는 보조 진행 색상입니다.
  3. 레이어 3은 주 진행률 표시줄 색상입니다.

아래 예제에서는 주 진행률 표시줄의 색상을 청록색으로 변경합니다.

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

건배.

-랜스

API 레벨 21 이상인 경우 다음 XML 특성을 사용할 수 있습니다.

<!-- For indeterminate progress bar -->
android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
android:progressTint="@color/white"
final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.getDrawable(2).setColorFilter(color,PorterDuff.Mode.SRC_IN);

간히덧임을 추가합니다.android:indeterminateTint="@color/colorPrimary"의 진행에 바에행.

예:

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminateTint="@color/colorPrimary"/>

BarStyle change 진행인경우중 BarStyle Horizontal 경android:progressTint="@color/colorPrimary"

예:

 <ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:progress="50"
    android:progressTint="@color/colorPrimary" />

제가 발견한 가장 간단한 해결책은 다음과 같습니다.

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

위 내용을 입력합니다.styles.xml철다하 아래에 파일을 합니다.res > values폴더를 누릅니다.

참고: 다른 액센트 색상을 사용하는 경우 이전 솔루션이 적합합니다.

API 21 이상

진행률 표시줄에 Android 추가:int="@color/red"(사용자의 색상)를 결정하지 마십시오.

프로그래밍 방식으로 실행하는 방법을 찾는 사용자:

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

그리기 가능한 id를 설정하는 것은 매우 중요하며 범위와 실제 진행 상태 막대를 보존합니다.

위해서LinearProgressIndicator에서 온com.google.android.material.progressindicator

당신은 그것을 가지고 놀 수 있습니다.trackColor그리고.indicatorColor enter image description here

당신들은 정말 나를 골치 아프게 합니다.먼저 xml을 통해 도면층 목록을 그릴있도록 만든 다음(첫 번째 도면층은 배경, 두 번째 도면층은 2차 진행률을, 마지막 도면층은 1차 진행률을 나타내는 또 다른 도면층) 다음을 수행하여 코드의 색상을 변경합니다.

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에 선언할 수 있으며, 특히 xml 파일 화면 폴더를 지정해야 할 경우 코드를 통해 색상만 수정할 수 있습니다.새 ShapeDrawable을 처음부터 다시 인스턴스화할 수 없습니다.

Progress Bar 색상은 다음과 같이 변경할 수 있습니다.

/res/values/values.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> 

작성 시:

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

필요한 배경을 그릴 수 있는 리소스를 만듭니다. 이 경우 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" />

그것은 저에게 잘 작동합니다.

사용자 정의 그리기 가능을 사용하여 진행률 표시줄을 스타일 지정할 수 있습니다.그리기 가능한 파일 만들기

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

xml 단위:

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

모델 보기:

fun getComplainStatusUpdate(position: Int):Int{

                val list = myAllComplainList!!.getValue()
                if (list!!.get(position).complainStatus.equals("P")) {
                  //  progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
                   // progressBar.setBackgroundResource(R.drawable.circle_shape)
                    return Color.RED
                } else if (list!!.get(position).complainStatus.equals("I")) {

                    return Color.GREEN
                } else {

                    return Color.GREEN
                }


return Color.CYAN
    }

Android에서 기본 및 보조 진행 색상을 프로그래밍 방식으로 수평 진행 표시줄로 설정하려면 아래 스니펫을 사용합니다.

int[][] states = new int[][] {
                        new int[] {-android.R.attr.state_checked},
                        new int[] {android.R.attr.state_checked},
                };

                int[] secondaryColor = new int[] {
                        context.getResources().getColor(R.color.graph_line_one),
                        Color.RED,
                };

                int[] primaryColor = new int[] {
                        context.getResources().getColor(R.color.middle_progress),
                        Color.BLUE,
                };
                progressbar.setProgressTintList(new ColorStateList(states, primaryColor));
                progressbar.setSecondaryProgressTintList(new ColorStateList(states, secondaryColor));

xml에서 이 옵션을 사용할 수 있습니다.

android:indeterminateTint="your_color"

언급URL : https://stackoverflow.com/questions/5745814/how-to-change-progressbars-progress-indicator-color-in-android

반응형