Android 實現(xiàn)自定義圓形進度條的功能
Android 實現(xiàn)自定義圓形進度條:
Android 自定義view,在大多數(shù)項目中根據(jù)客戶需求及用戶的體驗度來說,都要重新寫控件的來展示漂亮的界面,這里就對圓形進度條說下如何實現(xiàn)。
繪制自定義的圓形進度條,分為三個步驟,內(nèi)圓、外圓、文字。
其中內(nèi)圓和文字比較好繪制,進度條的變化是由外圓來控制的,所以核心就是繪制外圓。
首先定義分別定義這三個畫筆,兩個Paint和一個TextPaint
mCirclePaint = new Paint(); mCirclePaint.setAntiAlias(true); mCirclePaint.setStrokeWidth(CIRCLE_LINE_WIDTH); mCirclePaint.setStyle(Paint.Style.STROKE); mCirclePaint.setColor(ContextCompat.getColor(context, R.color.circle_color)); mCircleInnerPaint = new Paint(); mCircleInnerPaint.setAntiAlias(true); mCircleInnerPaint.setStyle(Paint.Style.FILL); mCircleInnerPaint.setColor(ContextCompat.getColor(context, R.color.circle_inner_color)); mTextPaint = new TextPaint(); mTextPaint.setAntiAlias(true); mTextPaint.setStyle(Paint.Style.FILL); mTextPaint.setTypeface(Typeface.DEFAULT_BOLD); mTextPaint.setColor(ContextCompat.getColor(context, R.color.circle_text_color)); mTextPaint.setTextSize(TEXT_SIZE);
然后讓我們分別繪制出這三個部分獲取自定義View的寬和高
float halfWidth = getMeasuredWidth() / 2;
float halfHeight = getMeasuredHeight() / 2;
繪制外圓
canvas.drawCircle(halfWidth, halfHeight, CIRCLE_RADIUS,mCirclePaint);
繪制內(nèi)圓
canvas.drawCircle(halfWidth, halfHeight,CIRCLE_RADIUS - CIRCLE_LINE_WIDTH / 2,mCircleInnerPaint);
繪制文字
canvas.drawText(mProgressText,halfWidth - mTextPaint.measureText(mProgressText) / 2,halfHeight - (mTextPaint.ascent() + mTextPaint.descent()) / 2,mTextPaint);
最后的效果如下圖
繪制完了基本的圖案,下一步就是實現(xiàn)進度條的動畫效果
進度條是實時變化的,所以需要不斷的去更新進度,進度可以用圓弧開繪制
設(shè)置進度的方法
public void setProgress(float progress) { if (progress > 100) { progress = 100; } if (progress < 0) { progress = 0; } mProgress = progress; mProgressText = "Pause"; mStartProgress = true; postInvalidate(); }
在Activity中開一個線程模擬網(wǎng)絡(luò)請求后更新進度條的操作
沒30毫秒更新一次數(shù)據(jù),當進度超過100,停止刷新界面
private void startProgress() { new Thread() { @Override public void run() { super.run(); float currentProgress = mCustomView.getCurrentProgress(); ++currentProgress; mCustomView.setProgress(currentProgress); try { sleep(30); if (currentProgress <= 100) { startProgress(); } else { mCustomView.progressFinished(); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); }
最核心的部分,進度更新后更新繪制圓形進度條
float halfWidth = getMeasuredWidth() / 2; float halfHeight = getMeasuredHeight() / 2; if (null == mCircleRectF) { mCircleRectF = new RectF(halfWidth - CIRCLE_RADIUS, halfHeight - CIRCLE_RADIUS, halfWidth + CIRCLE_RADIUS, halfHeight + CIRCLE_RADIUS); } if (mStartProgress) { float swipeProgress = mProgress / 100f * 360; LogUtils.e("swipeProgress = " + swipeProgress); canvas.drawArc(mCircleRectF, -90, swipeProgress, true, mCirclePaint); } else { canvas.drawCircle(halfWidth, halfHeight, CIRCLE_RADIUS,mCirclePaint); }
繪制的思路就是把progress進度轉(zhuǎn)換為圓弧的弧度,然后不斷繪制出來,這里要注意,從-90開始,也就是時鐘的0點時刻開始繪制。如果進度已經(jīng)繪制完成,或者還沒有開始,則直接繪制一個圓形。
大概思路就是這樣,最后上兩張效果圖
如果有什么更好的實現(xiàn)思路,可以一起討論學(xué)習(xí)。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android?JetPack組件的支持庫Databinding詳解
DataBinding是Google發(fā)布的一個數(shù)據(jù)綁定框架,它能夠讓開發(fā)者減少重復(fù)性非常高的代碼,如findViewById這樣的操作。其核心優(yōu)勢是解決了數(shù)據(jù)分解映射到各個view的問題,在MVVM框架中,實現(xiàn)的View和Viewmode的雙向數(shù)據(jù)綁定2022-08-08淺談Android中適配器的notifyDataSetChanged()為何有時不刷新
這篇文章主要介紹了淺談Android中適配器的notifyDataSetChanged()為何有時不刷新,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Android應(yīng)用APP自動更新功能的代碼實現(xiàn)
本篇文章主要介紹了Android應(yīng)用APP自動更新功能的代碼實現(xiàn),想要實現(xiàn)這個效果的同學(xué)可以了解一下。2016-11-11Android通過SeekBar調(diào)節(jié)布局背景顏色
這篇文章主要為大家詳細介紹了Android通過SeekBar調(diào)節(jié)布局背景顏色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04