Android自定義漂亮的圓形進(jìn)度條
這幾天對Android中實現(xiàn)畫圓弧及圓弧效果中所實現(xiàn)的效果進(jìn)行了修改,改為進(jìn)度圓心進(jìn)度條,效果如圖所示
TasksCompletedView.java 代碼如下
import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Paint.FontMetrics; import android.util.AttributeSet; import android.view.View; import com.snailws.taskscompleted.R; /** * @author naiyu(http://snailws.com) * @version 1.0 */ public class TasksCompletedView extends View { // 畫實心圓的畫筆 private Paint mCirclePaint; // 畫圓環(huán)的畫筆 private Paint mRingPaint; // 畫字體的畫筆 private Paint mTextPaint; // 圓形顏色 private int mCircleColor; // 圓環(huán)顏色 private int mRingColor; // 半徑 private float mRadius; // 圓環(huán)半徑 private float mRingRadius; // 圓環(huán)寬度 private float mStrokeWidth; // 圓心x坐標(biāo) private int mXCenter; // 圓心y坐標(biāo) private int mYCenter; // 字的長度 private float mTxtWidth; // 字的高度 private float mTxtHeight; // 總進(jìn)度 private int mTotalProgress = 100; // 當(dāng)前進(jìn)度 private int mProgress; public TasksCompletedView(Context context, AttributeSet attrs) { super(context, attrs); // 獲取自定義的屬性 initAttrs(context, attrs); initVariable(); } private void initAttrs(Context context, AttributeSet attrs) { TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TasksCompletedView, 0, 0); mRadius = typeArray.getDimension(R.styleable.TasksCompletedView_radius, 80); mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_strokeWidth, 10); mCircleColor = typeArray.getColor(R.styleable.TasksCompletedView_circleColor, 0xFFFFFFFF); mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor, 0xFFFFFFFF); mRingRadius = mRadius + mStrokeWidth / 2; } private void initVariable() { mCirclePaint = new Paint(); mCirclePaint.setAntiAlias(true); mCirclePaint.setColor(mCircleColor); mCirclePaint.setStyle(Paint.Style.FILL); mRingPaint = new Paint(); mRingPaint.setAntiAlias(true); mRingPaint.setColor(mRingColor); mRingPaint.setStyle(Paint.Style.STROKE); mRingPaint.setStrokeWidth(mStrokeWidth); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setStyle(Paint.Style.FILL); mTextPaint.setARGB(255, 255, 255, 255); mTextPaint.setTextSize(mRadius / 2); FontMetrics fm = mTextPaint.getFontMetrics(); mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent); } @Override protected void onDraw(Canvas canvas) { mXCenter = getWidth() / 2; mYCenter = getHeight() / 2; canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint); if (mProgress > 0 ) { RectF oval = new RectF(); oval.left = (mXCenter - mRingRadius); oval.top = (mYCenter - mRingRadius); oval.right = mRingRadius * 2 + (mXCenter - mRingRadius); oval.bottom = mRingRadius * 2 + (mYCenter - mRingRadius); canvas.drawArc(oval, -90, ((float)mProgress / mTotalProgress) * 360, false, mRingPaint); // // canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint); String txt = mProgress + "%"; mTxtWidth = mTextPaint.measureText(txt, 0, txt.length()); canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint); } } public void setProgress(int progress) { mProgress = progress; // invalidate(); postInvalidate(); } }
attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TasksCompletedView"> <attr name="radius" format="dimension"/> <attr name="strokeWidth" format="dimension"/> <attr name="circleColor" format="color"/> <attr name="ringColor" format="color"/> </declare-styleable> </resources>
源碼下載:http://xiazai.jb51.net/201701/yuanma/AndroidCompleted(jb51.net).rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義控件實現(xiàn)帶數(shù)值和動畫的圓形進(jìn)度條
- Android編程之ProgressBar圓形進(jìn)度條顏色設(shè)置方法
- Android三種方式實現(xiàn)ProgressBar自定義圓形進(jìn)度條
- Android帶進(jìn)度的圓形進(jìn)度條
- 自定義Android圓形進(jìn)度條(附源碼)
- Android使用Canvas繪制圓形進(jìn)度條效果
- Android studio圓形進(jìn)度條 百分?jǐn)?shù)跟隨變化
- Android自定義控件實現(xiàn)圓形進(jìn)度條
- Android自定義View之圓形進(jìn)度條式按鈕
- Android自定義控件實現(xiàn)帶文本與數(shù)字的圓形進(jìn)度條
相關(guān)文章
Android Studio里如何使用lambda表達(dá)式
這篇文章主要介紹了Android Studio里如何使用lambda表達(dá)式,需要的朋友可以參考下2017-05-05android基于dialog實現(xiàn)等待加載框示例
本篇文章主要介紹了android基于dialog實現(xiàn)等待加載框示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Kotlin?Flow數(shù)據(jù)流的3種使用場景詳解
這篇文章主要為大家詳細(xì)介紹了Kotlin中Flow數(shù)據(jù)流的幾種使用場景,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下2023-04-04Android使用Room操作數(shù)據(jù)庫流程詳解
谷歌推薦使用Room操作數(shù)據(jù)庫,Room在 SQLite 上提供了一個抽象層,在充分利用 SQLite強(qiáng)大功能的同時,能夠流暢地訪問數(shù)據(jù)庫2022-11-11Android使用TextInputLayout創(chuàng)建登陸頁面
這篇文章主要為大家詳細(xì)介紹了Android使用TextInputLayout創(chuàng)建登陸頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Android自定義view仿微信刷新旋轉(zhuǎn)小風(fēng)車
這篇文章主要介紹了Android自定義view仿微信刷新旋轉(zhuǎn)小風(fēng)車,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12