Android實(shí)現(xiàn)環(huán)形進(jìn)度條代碼
本文參考借鑒:http://www.dhdzp.com/article/102983.htm
先上效果圖:

自定義控件:AttendanceProgressBar
代碼如下:
public class AttendanceProgressBar extends View {
// 畫圓環(huán)底部的畫筆
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 = 80;
//字體顏色
private int mTextColor;
// 字體大小
private float mTextSize;
public AttendanceProgressBar(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.AttendanceProgressBar, 0, 0);
mRadius = typeArray.getDimension(R.styleable.AttendanceProgressBar_radius, 80);
mStrokeWidth = typeArray.getDimension(R.styleable.AttendanceProgressBar_strokeWidth, 10);
mCircleColor = typeArray.getColor(R.styleable.AttendanceProgressBar_circleColor, 0xFFFFFFFF);
mRingColor = typeArray.getColor(R.styleable.AttendanceProgressBar_ringColor, 0xFFFFFFFF);
mTextColor = typeArray.getColor(R.styleable.AttendanceProgressBar_textColor, 0xFF000000);
mTextSize = typeArray.getDimension(R.styleable.AttendanceProgressBar_textSize, 80);
mRingRadius = mRadius + mStrokeWidth / 2;
}
private void initVariable() {
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(mCircleColor);
// mCirclePaint.setStyle(Paint.Style.FILL);
mCirclePaint.setStyle(Paint.Style.STROKE);
mCirclePaint.setStrokeWidth(mStrokeWidth);
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.setColor(mTextColor);
// mTextPaint.setARGB(255, 255, 255, 255);
// mTextPaint.setTextSize(mRadius / 2);
mTextPaint.setTextSize(mTextSize);
Paint.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);
canvas.drawCircle(mXCenter, mYCenter, mRingRadius, mCirclePaint);
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 + "%";
String txt = "16/18";
mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
// canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);
canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4 - dipToPx(10), mTextPaint);
txt = "出勤人數(shù)";
mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4 + dipToPx(10), mTextPaint);
}
public void setProgress(int progress) {
mProgress = progress;
postInvalidate();
}
private int dipToPx(int dip) {
float scale = getContext().getResources().getDisplayMetrics().density;
return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
}
}
因為是自定義控件,所以在attr.xml文件定義了一些控件屬性,以便在xml文件中設(shè)置這些屬性
代碼如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AttendanceProgressBar"> <attr name="radius" format="dimension"/> <attr name="strokeWidth" format="dimension"/> <attr name="circleColor" format="color"/> <attr name="ringColor" format="color"/> <attr name="textColor" format="color"/> <attr name="textSize" format="dimension"/> </declare-styleable> </resources>
最后,在xml文件中,可以這樣使用
<com.ztd.lieyi.widget.AttendanceProgressBar android:layout_gravity="center" android:layout_width="100dp" android:layout_height="100dp" app:radius="45dp" app:strokeWidth="5dp" app:textSize="@dimen/text_16" app:textColor="@color/color_333333" app:circleColor="@color/color_d5ebfd" app:ringColor="@color/color_2c9df7"/>
這只是初步處理,使用時可以根據(jù)需求酌情處理。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)環(huán)形進(jìn)度條
- Android自定義環(huán)形LoadingView效果
- Android自定義View實(shí)現(xiàn)環(huán)形進(jìn)度條的思路與實(shí)例
- Android實(shí)現(xiàn)計步進(jìn)度的環(huán)形Progress
- Android實(shí)現(xiàn)環(huán)形進(jìn)度條的實(shí)例
- Android應(yīng)用中炫酷的橫向和環(huán)形進(jìn)度條的實(shí)例分享
- Android中制作進(jìn)度框和環(huán)形進(jìn)度條的簡單實(shí)例分享
- Android環(huán)形進(jìn)度條(安卓默認(rèn)形式)實(shí)例代碼
- android自定義環(huán)形對比圖效果
相關(guān)文章
android app跳轉(zhuǎn)應(yīng)用商店實(shí)現(xiàn)步驟
這篇文章主要為大家介紹了android app跳轉(zhuǎn)應(yīng)用商店實(shí)現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧
今天小編就為大家分享一篇關(guān)于Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
Android同步屏障機(jī)制sync barrier實(shí)例應(yīng)用詳解
這篇文章主要介紹了Android同步屏障機(jī)制sync barrier實(shí)例應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
android 仿微信demo——微信消息界面實(shí)現(xiàn)(移動端)
本系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能給你們提供幫助2021-06-06

