自定義Android progressbar

先看效果


Dingtalk_20221102150140.jpg

主要有5種顏色:
1.整體背景色
2.progressbar的背景色
3.進度圓點的顏色
4.進度顏色的開始和結(jié)束顏色

代碼

package com.example.mydemo2

import android.content.Context
import android.graphics.*
import android.util.AttributeSet
import android.util.TypedValue
import android.view.View

/**
 * @author xiaozhi
 * @CreateDate 2022/3/2 2:23 下午
 * @Description
 */
open class SampleProgressView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : View(context, attrs, defStyleAttr, defStyleRes) {
    private var mHeight = 0
    private var mProgressWidth = 0
    private var mProgressHeight = 0
    private var mMaxProgress = 100f
    private var mCurrentProgress = 0
    private var textMargin = 0
    private val startColor="#1EF1C6"http://開始顏色
    private val endColor="#00B79B"http://結(jié)束的顏色
    //底色背景圖
    private var mProgressPaint = Paint().apply {
        color = Color.parseColor("#131313")
        style = Paint.Style.FILL
    }
    private var mCompleteProgressPaint = Paint().apply {
        style = Paint.Style.FILL
        color = Color.parseColor(endColor)
    }
    private var mCirClePaint = Paint()

    private var mTextPaint = Paint().apply {
        color = Color.WHITE
        isAntiAlias = true
        textAlign = Paint.Align.LEFT
    }

    private var helperPaint = Paint().apply {
        color = Color.parseColor(endColor)
    }
    //private lateinit var bitmap: Bitmap
    private val color1 = Color.parseColor(startColor)
    private val color2 = Color.parseColor(endColor)

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        mTextPaint.textSize = dip2px(10).toFloat()
        //bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_seekbar)
        mProgressWidth = MeasureSpec.getSize(widthMeasureSpec)
        mHeight = dip2px(20)
        mProgressHeight = dip2px(12)
        textMargin = dip2px(5)
        setMeasuredDimension(mProgressWidth, mHeight)
    }

    /**
     * dp 2 px
     *
     * @param dpVal
     */
    private fun dip2px(dpVal: Int): Int {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            dpVal.toFloat(), resources.displayMetrics
        ).toInt()
    }
    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        val progress = mCurrentProgress / mMaxProgress
        val spaceH = (mHeight - mProgressHeight) / 2f  //上間距

        val rectProgress = RectF(0f, spaceH, mProgressWidth.toFloat(), mHeight - spaceH)
//底部框
        canvas.drawRoundRect(rectProgress, mHeight / 2f, mHeight / 2f, mProgressPaint)

        val completeLength = (mCurrentProgress / mMaxProgress) * mProgressWidth.toFloat()
        val rectCompleteProgress = RectF(0f, spaceH, completeLength, mHeight - spaceH)

//漸變色進度條
        mCompleteProgressPaint.shader = LinearGradient(
            rectCompleteProgress.left,
            rectCompleteProgress.bottom / 2,
            rectCompleteProgress.right, rectCompleteProgress.bottom / 2,
            color1,
            color2,
            Shader.TileMode.CLAMP
        )
//進度框
        canvas.drawRoundRect(
            rectCompleteProgress,
            mHeight / 2f,
            mHeight / 2f,
            mCompleteProgressPaint
        )
        if(progress<1){
            val rectCompleteProgressHelper =
                RectF(rectCompleteProgress.right-mHeight/2f,
                    rectCompleteProgress.top,
                    rectCompleteProgress.right,
                    rectCompleteProgress.bottom)
           
            canvas.drawRect(
                rectCompleteProgressHelper,
                helperPaint
            )
        }

        val changeRange = mProgressWidth  //圓心游標(biāo)的移動長度范圍
        val circleLength = (mCurrentProgress / mMaxProgress) * changeRange.toFloat() + mProgressHeight/2
        //canvas.drawBitmap(bitmap,null, Rect((circleLength - mHeight / 2).toInt(), 0,(circleLength + mHeight / 2).toInt(),mHeight),mCirClePaint)
        mCirClePaint.color = -0x1//白色圓點
        canvas.drawCircle(circleLength, mHeight/2.toFloat(), mProgressHeight/2.toFloat(), mCirClePaint)

    }


    fun setCurrentProgress(progress: Int) {
        mCurrentProgress = progress
        postInvalidate()
    }

    fun setMaxProgress(maxProgress: Float) {
        mMaxProgress = maxProgress
    }
}

調(diào)用

<com.example.mydemo2.SampleProgressView
        android:id="@+id/sampleProgressView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#222222"
        android:layout_marginTop="10dp" />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骄恶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谣拣,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡袱结,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門途凫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垢夹,“玉大人,你說我怎么就攤上這事维费」” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵犀盟,是天一觀的道長而晒。 經(jīng)常有香客問我,道長阅畴,這世上最難降的妖魔是什么倡怎? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮贱枣,結(jié)果婚禮上监署,老公的妹妹穿的比我還像新娘。我一直安慰自己纽哥,他們只是感情好焦匈,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昵仅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摔笤,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天够滑,我揣著相機與錄音,去河邊找鬼吕世。 笑死彰触,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的命辖。 我是一名探鬼主播况毅,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尔艇!你這毒婦竟也來了尔许?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤终娃,失蹤者是張志新(化名)和其女友劉穎味廊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棠耕,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡余佛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窍荧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辉巡。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蕊退,靈堂內(nèi)的尸體忽然破棺而出郊楣,到底是詐尸還是另有隱情,我是刑警寧澤咕痛,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布痢甘,位于F島的核電站,受9級特大地震影響茉贡,放射性物質(zhì)發(fā)生泄漏塞栅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一腔丧、第九天 我趴在偏房一處隱蔽的房頂上張望放椰。 院中可真熱鬧,春花似錦愉粤、人聲如沸砾医。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽如蚜。三九已至压恒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間错邦,已是汗流浹背探赫。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撬呢,地道東北人伦吠。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像魂拦,于是被迫代替她去往敵國和親毛仪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容