

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 프로그래스바의 바탕 색깔 -->
    <item android:id="@android:id/background">
        <shape>
            <gradient
                android:angle="270"
                android:centerColor="@color/gray1"
                android:centerY="1.0"
                android:endColor="@color/gray1"
                android:startColor="@color/gray1" />
        </shape>
    </item>
    <!-- 프로그래스바의 진행률 색깔 선택 -->
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <gradient
                    android:angle="0"
                    android:centerX="0.25"
                    android:endColor="@color/gredient_start"
                    android:startColor="@color/gredient_end" />
            </shape>
        </clip>
    </item>
</layer-list>
centerColor를 통해 3가지 색으로 그라데이션을 넣을 수 있지만
저는 2가지 색의 그라데이션만 필요하기 때문에 center를 제외했습니다

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <ProgressBar
        android:id="@+id/pb_home_progressbar"
        style="@style/HorizontalProgressBarStyle"
        android:layout_marginTop="50dp"
        android:progressDrawable="@drawable/home_progressbar_green"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:progress="100" />
    <TextView
        android:id="@+id/tv_home_total_kcal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="28dp"
        android:background="@drawable/home_kcal_background"
        android:gravity="center_horizontal"
        android:includeFontPadding="false"
        android:paddingStart="4dp"
        android:paddingEnd="4dp"
        android:paddingBottom="10dp"
        android:textAppearance="@style/Bold.Body6"
        android:textColor="@color/gray4"
        app:layout_constraintBottom_toTopOf="@+id/pb_home_progressbar"
        app:layout_constraintEnd_toEndOf="parent"
        tools:text="100kcal" />
    <TextView
        android:id="@+id/tv_home_now_kcal"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@drawable/home_kcal_background"
        android:gravity="end"
        android:includeFontPadding="false"
        android:paddingStart="4dp"
        android:paddingEnd="4dp"
        android:paddingBottom="10dp"
        android:textAppearance="@style/Bold.Body6"
        android:textColor="@color/base3"
        android:visibility="invisible"
        app:layout_constraintBottom_toTopOf="@+id/pb_home_progressbar"
        app:layout_constraintStart_toStartOf="parent"
        tools:text="100 kcal" />
</androidx.constraintlayout.widget.ConstraintLayout>
progressBar의 width와 height의 길이를 조정하는 부분을 style에서 코드를 작성해줍니다
tv_home_total_kcal의 위치는 고정 시키고 값만 변화시켜주고
tv_home_now_kcal의 위치는 서버에서 받아온 데이터를 비율에 맞게 이동시켜줄 것 입니다
class CustomProgressbar @JvmOverloads constructor(
    context: Context,
    attributeSet: AttributeSet? = null,
    defStyleAttr: Int = 0
) :
    LinearLayout(context, attributeSet, defStyleAttr) {
    val kcalMax = 100
    var currentkcal = 0
        private set
    var currentKcalLength = 0
        private set
    val binding: LayoutHomeGredientProgressbarBinding =
 LayoutHomeGredientProgressbarBinding.inflate(LayoutInflater.from(context), this, true)
    init {
        binding.pbHomeProgressbar.max = kcalMax
        setTextView(0, binding.tvHomeNowKcal)
        setTextView(kcalMax, binding.tvHomeTotalKcal)
    }
    fun setCurrentKcal(kcal: Int) {
        currentkcal = kcal
        binding.pbHomeProgressbar.progress = currentkcal
        var leftMargine = 0
        
        when(currentKcalLength) {
            in 0..1 -> {
                leftMargine = getSizeProgress() * currentkcal  / kcalMax - 105
            }
            2 -> {
                leftMargine = getSizeProgress() * currentkcal  / kcalMax - 120
            }
            3 -> {
                leftMargine = getSizeProgress() * currentkcal  / kcalMax - 140
            }
            4 -> {
                leftMargine = getSizeProgress() * currentkcal  / kcalMax - 160
            }
        }
        Log.d("length",currentKcalLength.toString())
        binding.tvHomeNowKcal.updateLayoutParams<MarginLayoutParams> {
            this.marginStart = leftMargine
        }
    }
    fun getSizeProgress(): Int {
        return binding.pbHomeProgressbar.width
    }
    fun setCurrentKcalLength(kcal: Int) {
        currentKcalLength = kcal.toString().length
    }
    fun setTextView(progress: Int, textview: TextView) {
        textview.setText("${progress} kcal")
    }
}
var kcalMax = 100
비율로 위치를 움직이려 하기 때문에 100으로 고정했습니다
var currentKcal = 0
현재 kcal의 값. 초깃값은 0 입니다
var currentKcalLength = 0
받아온 현재 kcal의 string 길이. 초깃값은 0 입니다
private set
멤버 변수의 setter를 private로 지정하여, 클래스 외부에서 해당 변수를 직접 접근하여 수정할 수 없게 함으로써, 보다 안전하게 관리할 수 있게 합니다
fun getSizeProgress()
프로그레스바의 너비를 계산합니다
프로그래스바의 실제 너비를 구하기 위해서 패딩을 설정했다면 아래와 같이 패딩을 빼주면 됩니다
binding.apply {
            pbHomeProgressbar.apply {
                width - paddingLeft - paddingRight
            }
        }
fun setCurrentKcal(kcal: Int)
그림과 같이 달라진 값의 비율만큼 now의 위치를 이동시키는 함수이지만
TextView에 같은 자릿수더라도 숫자가 달라지면 약간의 사이즈가 달라지게 되는데
미숙하여 정확하게 맞추는 방법을 모르겠습니다 ...😅
혹시나 아시는 분 있으면 댓글 부탁드립니다 ! 
<com.project.veganlife.home.CustomProgressbar
	android:id="@+id/cp_home_progressbar"
	android:layout_width="0dp"
	android:layout_height="wrap_content"
	app:layout_constraintBottom_toTopOf="@id/cl_home_kcal"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent" />
사용하려는 fragment에서 불러와주시면 됩니다 !
지난 포스팅과는 크게 달라졌다고 볼 수는 없지만 전과는 달리 부분 개선을 진행했습니다