Android自定義View弧線進度控件
這個是一個以弧線為依托的進度控件,主要包括了兩個圓弧、一個圓、一個文本。
當我們點擊開始按鈕的時候,會出現(xiàn)一個動畫,逐漸的出現(xiàn)進度,好了,下面開始我們的編碼。
新建一個類,繼承自View,實現(xiàn)三個構(gòu)造方法,接著定義變量,初始化變量的數(shù)據(jù)。代碼如下:
private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCircleXY; private float mSweepValue = 0; private String mShowText = "0%"; private RectF mRectF; public MViewOne(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } public MViewOne(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public MViewOne(Context context) { super(context); initView(); } private void initView() { mArcPaint = new Paint(); mArcPaint.setStrokeWidth(50); mArcPaint.setAntiAlias(true); mArcPaint.setColor(Color.GREEN); mArcPaint.setStyle(Style.STROKE); mCirclePaint = new Paint(); mCirclePaint.setColor(Color.GREEN); mCirclePaint.setAntiAlias(true); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setColor(Color.RED); mTextPaint.setStrokeWidth(0); mPaint = new Paint(); mPaint.setStrokeWidth(40); mPaint.setAntiAlias(true); mPaint.setColor(Color.YELLOW); mPaint.setStyle(Style.STROKE); }
可以看到,這里一共定義了四個畫筆,兩個畫弧形,一個畫文本,還有一個繪制圓。
在我們的onSizeChange方法里面,再給變量賦值。
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); length = w; mCircleXY = length / 2; mRadius = (float) (length * 0.5 / 2); }
這時候,圓的半徑、圓的起繪點,都已經(jīng)有值了。
下面開始繪制
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 畫圓 mRectF = new RectF((float) (length * 0.1), (float) (length * 0.1), (float) (length * 0.9), (float) (length * 0.9)); canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint); // 畫弧線 canvas.drawArc(mRectF, 270, 360, false, mPaint); canvas.drawArc(mRectF, 270, mSweepValue, false, mArcPaint); // 繪制文字 float textWidth = mTextPaint.measureText(mShowText); //測量字體寬度,我們需要根據(jù)字體的寬度設(shè)置在圓環(huán)中間 canvas.drawText(mShowText, (int)(length/2-textWidth/2), (int)(length/2+textWidth/2) , mTextPaint); }
這個時候,全部的效果已經(jīng)出來了,但是這個還是靜態(tài)的,對外暴露一個方法,讓數(shù)據(jù)可以動態(tài)的刷新
public void setProgress(float mSweepValue) { float a = (float) mSweepValue; if (a != 0) { this.mSweepValue = (float) (360.0 * (a / 100.0)); mShowText = mSweepValue + "%"; Log.e("this.mSweepValue:", this.mSweepValue + ""); } else { this.mSweepValue = 25; mShowText = 25 + "%"; } invalidate(); }
好了,所有的代碼都在這里了,老規(guī)矩,最后我貼上全部的代碼:
public class MViewOne extends View { private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCircleXY; private float mSweepValue = 0; private String mShowText = "0%"; private RectF mRectF; public MViewOne(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } public MViewOne(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public MViewOne(Context context) { super(context); initView(); } private void initView() { mArcPaint = new Paint(); mArcPaint.setStrokeWidth(50); mArcPaint.setAntiAlias(true); mArcPaint.setColor(Color.GREEN); mArcPaint.setStyle(Style.STROKE); mCirclePaint = new Paint(); mCirclePaint.setColor(Color.GREEN); mCirclePaint.setAntiAlias(true); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setColor(Color.RED); mTextPaint.setStrokeWidth(0); mPaint = new Paint(); mPaint.setStrokeWidth(40); mPaint.setAntiAlias(true); mPaint.setColor(Color.YELLOW); mPaint.setStyle(Style.STROKE); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); length = w; mCircleXY = length / 2; mRadius = (float) (length * 0.5 / 2); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 畫圓 mRectF = new RectF((float) (length * 0.1), (float) (length * 0.1), (float) (length * 0.9), (float) (length * 0.9)); canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint); // 畫弧線 canvas.drawArc(mRectF, 270, 360, false, mPaint); canvas.drawArc(mRectF, 270, mSweepValue, false, mArcPaint); // 繪制文字 float textWidth = mTextPaint.measureText(mShowText); //測量字體寬度,我們需要根據(jù)字體的寬度設(shè)置在圓環(huán)中間 canvas.drawText(mShowText, (int)(length/2-textWidth/2), (int)(length/2+textWidth/2) , mTextPaint); } public void setProgress(float mSweepValue) { float a = (float) mSweepValue; if (a != 0) { this.mSweepValue = (float) (360.0 * (a / 100.0)); mShowText = mSweepValue + "%"; Log.e("this.mSweepValue:", this.mSweepValue + ""); } else { this.mSweepValue = 25; mShowText = 25 + "%"; } invalidate(); } }
謝謝閱讀,學習重在堅持,貴在堅持。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android自定義View實現(xiàn)帶數(shù)字的進度條實例代碼
- Android 自定義view和屬性動畫實現(xiàn)充電進度條效果
- Android自定義View基礎(chǔ)開發(fā)之圖片加載進度條
- Android自定義view實現(xiàn)水波紋進度球效果
- Android自定義View仿華為圓形加載進度條
- Android自定義View之圓形進度條式按鈕
- Android自定義View實現(xiàn)漸變色進度條
- Android自定義View實現(xiàn)環(huán)形進度條的思路與實例
- android自定義view制作圓形進度條效果
- Android自定義View實現(xiàn)簡單炫酷的球體進度球?qū)嵗a
相關(guān)文章
Android ListView用EditText實現(xiàn)搜索功能效果
本篇文章主要介紹了Android ListView用EditText實現(xiàn)搜索功能效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03Android 使用Vitamio打造自己的萬能播放器(1)——準備
本文主要介紹Android Vitamio,在Android開發(fā)視頻播放器的時候,大家經(jīng)常會遇到系統(tǒng)版本和不同的Android手機不同導(dǎo)致開發(fā)的軟件不能完美適用,這里給大家介紹個播放器插件可以適應(yīng)所有Android設(shè)備2016-07-07Android TextView高級顯示技巧實例小結(jié)
這篇文章主要介紹了Android TextView高級顯示技巧,結(jié)合實例形式總結(jié)分析了Android TextView控件進行文字與圖片顯示的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10Android ItemDecoration 實現(xiàn)分組索引列表的示例代碼
本篇文章主要介紹了Android ItemDecoration 實現(xiàn)分組索引列表的示例代碼,具有一定的參考價值,有興趣的可以了解一下2017-10-10