Android自定義View弧線進度控件
這個是一個以弧線為依托的進度控件,主要包括了兩個圓弧、一個圓、一個文本。
當(dāng)我們點擊開始按鈕的時候,會出現(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();
}
}
謝謝閱讀,學(xué)習(xí)重在堅持,貴在堅持。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 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 將 android view 的位置設(shè)為右下角的解決方法
Android 將 android view 的位置設(shè)為右下角的解決方法,需要的朋友可以參考一下2013-05-05
Android實現(xiàn)向Launcher添加快捷方式的方法
這篇文章主要介紹了Android實現(xiàn)向Launcher添加快捷方式的方法,涉及Android添加快捷方式的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
Android開發(fā)圖片水平旋轉(zhuǎn)180度方法
今天小編就為大家分享一篇Android開發(fā)圖片水平旋轉(zhuǎn)180度方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
詳解android使用ItemDecoration 懸浮導(dǎo)航欄效果
本篇文章主要介紹了Android 最流行的吸頂效果的實現(xiàn)及代碼,非常具有實用價值,需要的朋友可以參考下。2017-01-01
Android自定義View構(gòu)造函數(shù)詳解
這篇文章主要為大家詳細介紹了Android自定義View構(gòu)造函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
android 網(wǎng)絡(luò)請求庫volley方法詳解
這篇文章主要介紹了android 網(wǎng)絡(luò)請求庫volley方法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android 開發(fā)調(diào)試工具的使用總結(jié)
這篇文章主要介紹了Android 開發(fā)調(diào)試工具的使用總結(jié)的相關(guān)資料,這里整理了,Android開發(fā)所需要的常用工具,需要的朋友可以參考下2016-11-11

