Custom View to implement Android circular progress bar, supports custom display styles, viewandroid

Source: Internet
Author: User

Custom View to implement Android circular progress bar, supports custom display styles, viewandroid

I copied a memo based entirely on this.Click here to view the original version

The Code is as follows:

1. res/values/attrs. xml

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="RoundProgressBar">        <attr name="roundColor" format="color" />        <attr name="roundProgressColor" format="color" />        <attr name="roundWidth" format="dimension"></attr>        <attr name="textColor" format="color" />        <attr name="textSize" format="dimension" />        <attr name="max" format="integer"></attr>        <attr name="textIsDisplayable" format="boolean"></attr>        <attr name="style">            <enum name="STROKE" value="0"></enum>            <enum name="FILL" value="1"></enum>        </attr>    </declare-styleable></resources>

2. Specific implementation

public class RoundProgressBar extends View {private Paint mPaint;private int mRoundColor;private int mProgressColor;private int mTextColor;private int mTextSize;private float mRounWidth;private int mMaxProgress;private int mCurrentProgress = 45;private boolean mTextIsDisplayable;private int mStyle = 1;private static final int STROKE = 0;private static final int FILL =1;public RoundProgressBar(Context context) {this(context, null);}public RoundProgressBar(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RoundProgressBar(Context context, AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr);mPaint = new Paint();TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);mRoundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);mProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);mTextColor = typedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.BLUE);mTextSize = typedArray.getDimensionPixelSize(R.styleable.RoundProgressBar_textSize, 15);mRounWidth = typedArray.getDimensionPixelSize(R.styleable.RoundProgressBar_roundWidth, 5);mMaxProgress = typedArray.getInt(R.styleable.RoundProgressBar_max, 100);mTextIsDisplayable = typedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);mStyle = typedArray.getInt(R.styleable.RoundProgressBar_style, STROKE);typedArray.recycle();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// Draw outer circleint center = getWidth() / 2;int radius = (int) (center - mRounWidth / 2);mPaint.setColor(mRoundColor);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(mRounWidth);mPaint.setAntiAlias(true);canvas.drawCircle(center, center, radius, mPaint);// Draw progressmPaint.setStrokeWidth(mRounWidth);mPaint.setColor(mProgressColor);RectF oval = new RectF(center - radius, center - radius,center + radius, center + radius);switch (mStyle) {case STROKE:mPaint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval, 0, 360 * mCurrentProgress / mMaxProgress, false, mPaint);break;case FILL:mPaint.setStyle(Paint.Style.FILL_AND_STROKE);if (mCurrentProgress != 0) {canvas.drawArc(oval, 0, 360 * mCurrentProgress / mMaxProgress, true, mPaint);}break;default:break;}mPaint.setStrokeWidth(0);mPaint.setColor(mTextColor);mPaint.setTextSize(mTextSize);mPaint.setTypeface(Typeface.DEFAULT);int percent = (int) (((float) mCurrentProgress / (float) mMaxProgress) * 100);float textWidth = mPaint.measureText(percent + "%");if (percent != 0 && mTextIsDisplayable) {canvas.drawText(percent + "%", center - textWidth / 2, center + mTextSize / 2, mPaint);}}public int getRoundColor() {return mRoundColor;}public void setRoundColor(int roundColor) {this.mRoundColor = roundColor;}public int getProgressColor() {return mProgressColor;}public void setProgressColor(int progressColor) {this.mProgressColor = progressColor;}public int getTextColor() {return mTextColor;}public void setTextColor(int textColor) {this.mTextColor = textColor;}public int getTextSize() {return mTextSize;}public void setTextSize(int textSize) {this.mTextSize = textSize;}public float getRounWidth() {return mRounWidth;}public void setmRounWidth(float mRounWidth) {this.mRounWidth = mRounWidth;}public synchronized int getMaxProgress() {return mMaxProgress;}public synchronized void setMaxProgress(int maxProgress) {if (maxProgress < 0) {throw new IllegalArgumentException("Max Progress not less than 0");} this.mMaxProgress = maxProgress;}public synchronized int getCurrentProgress() {return mCurrentProgress;}public synchronized void setCurrentProgress(int currentProgress) {if (currentProgress < 0) {throw new IllegalArgumentException("Progress not less than 0");}if (currentProgress > mMaxProgress) {currentProgress = mMaxProgress;}if (currentProgress <= mMaxProgress) {this.mCurrentProgress = currentProgress;postInvalidate();}}public boolean isTextIsDisplayable() {return mTextIsDisplayable;}public void setTextDisplayable(boolean displayable) {this.mTextIsDisplayable = displayable;}public int getStyle() {return mStyle;}public void setStyle(int style) {this.mStyle = style;}}


3. layout files

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:android_custom="http://schemas.android.com/apk/res/com.example.demo"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.gaussianblur.MainActivity" >    <com.example.demo.RoundProgressBar        android:id="@+id/roundProgressBar"        android:layout_width="80dip"        android:layout_height="80dip"        android:layout_marginBottom="78dp"        android:layout_gravity="center"        android_custom:roundColor="#D1D1D1"        android_custom:roundProgressColor="@android:color/holo_orange_dark"        android_custom:roundWidth="4dip"        android_custom:textColor="#9A32CD"        android_custom:textIsDisplayable="true"        android_custom:textSize="18sp" /></FrameLayout>


4,





Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.