android 数字进度条--NumberProgressBar

来源:互联网 发布:保安巡更软件 编辑:程序博客网 时间:2024/04/28 15:32

有点时间就分享出来吧,其实源码是在github上找的,但是下载下来不好使,所以自己把他的代码看来一下


效果不错吧!

下面就上代码了---

package com.example.bb;public interface OnProgressBarListener {void onProgressChange(int current, int max);}
重点:

package com.example.bb;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.os.Bundle;import android.os.Parcelable;import android.util.AttributeSet;import android.view.View;//com.example.bb.numberprogressbarpublic class NumberProgressBar extends View {private int mMaxProgress = 100;/** * Current progress, can not exceed the max progress. */private int mCurrentProgress = 0;/** * The progress area bar color. */private int mReachedBarColor;/** * The bar unreached area color. */private int mUnreachedBarColor;/** * The progress text color. */private int mTextColor;/** * The progress text size. */private float mTextSize;/** * The height of the reached area. */private float mReachedBarHeight;/** * The height of the unreached area. */private float mUnreachedBarHeight;/** * The suffix of the number. */private String mSuffix = "%";/** * The prefix. */private String mPrefix = "";private final int default_text_color = Color.rgb(66, 145, 241);private final int default_reached_color = Color.rgb(66, 145, 241);private final int default_unreached_color = Color.rgb(204, 204, 204);private final float default_progress_text_offset;private final float default_text_size;private final float default_reached_bar_height;private final float default_unreached_bar_height;/** * For save and restore instance of progressbar. */private static final String INSTANCE_STATE = "saved_instance";private static final String INSTANCE_TEXT_COLOR = "text_color";private static final String INSTANCE_TEXT_SIZE = "text_size";private static final String INSTANCE_REACHED_BAR_HEIGHT = "reached_bar_height";private static final String INSTANCE_REACHED_BAR_COLOR = "reached_bar_color";private static final String INSTANCE_UNREACHED_BAR_HEIGHT = "unreached_bar_height";private static final String INSTANCE_UNREACHED_BAR_COLOR = "unreached_bar_color";private static final String INSTANCE_MAX = "max";private static final String INSTANCE_PROGRESS = "progress";private static final String INSTANCE_SUFFIX = "suffix";private static final String INSTANCE_PREFIX = "prefix";private static final String INSTANCE_TEXT_VISIBILITY = "text_visibility";private static final int PROGRESS_TEXT_VISIBLE = 0;/** * The width of the text that to be drawn. */private float mDrawTextWidth;/** * The drawn text start. */private float mDrawTextStart;/** * The drawn text end. */private float mDrawTextEnd;/** * The text that to be drawn in onDraw(). */private String mCurrentDrawText;/** * The Paint of the reached area. */private Paint mReachedBarPaint;/** * The Paint of the unreached area. */private Paint mUnreachedBarPaint;/** * The Paint of the progress text. */private Paint mTextPaint;/** * Unreached bar area to draw rect. */private RectF mUnreachedRectF = new RectF(0, 0, 0, 0);/** * Reached bar area rect. */private RectF mReachedRectF = new RectF(0, 0, 0, 0);/** * The progress text offset. */private float mOffset;/** * Determine if need to draw unreached area. */private boolean mDrawUnreachedBar = true;private boolean mDrawReachedBar = true;private boolean mIfDrawText = true;/** * Listener */private OnProgressBarListener mListener;public enum ProgressTextVisibility {Visible, Invisible}public NumberProgressBar(Context context) {this(context, null);}public NumberProgressBar(Context context, AttributeSet attrs) {this(context, attrs, R.attr.numberProgressBarStyle);}public NumberProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);default_reached_bar_height = dp2px(1.5f);default_unreached_bar_height = dp2px(1.0f);default_text_size = sp2px(10);default_progress_text_offset = dp2px(3.0f);// load styled attributes.final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.NumberProgressBar,defStyleAttr, 0);mReachedBarColor = attributes.getColor(R.styleable.NumberProgressBar_progress_reached_color,default_reached_color);mUnreachedBarColor = attributes.getColor(R.styleable.NumberProgressBar_progress_unreached_color,default_unreached_color);mTextColor = attributes.getColor(R.styleable.NumberProgressBar_progress_text_color, default_text_color);mTextSize = attributes.getDimension(R.styleable.NumberProgressBar_progress_text_size, default_text_size);mReachedBarHeight = attributes.getDimension(R.styleable.NumberProgressBar_progress_reached_bar_height,default_reached_bar_height);mUnreachedBarHeight = attributes.getDimension(R.styleable.NumberProgressBar_progress_unreached_bar_height,default_unreached_bar_height);mOffset = attributes.getDimension(R.styleable.NumberProgressBar_progress_text_offset,default_progress_text_offset);int textVisible = attributes.getInt(R.styleable.NumberProgressBar_progress_text_visibility,PROGRESS_TEXT_VISIBLE);if (textVisible != PROGRESS_TEXT_VISIBLE) {mIfDrawText = false;}setProgress(attributes.getInt(R.styleable.NumberProgressBar_progress_current, 0));setMax(attributes.getInt(R.styleable.NumberProgressBar_progress_max, 100));attributes.recycle();initializePainters();}@Overrideprotected int getSuggestedMinimumWidth() {return (int) mTextSize;}@Overrideprotected int getSuggestedMinimumHeight() {return Math.max((int) mTextSize, Math.max((int) mReachedBarHeight, (int) mUnreachedBarHeight));}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measure(widthMeasureSpec, true), measure(heightMeasureSpec, false));}private int measure(int measureSpec, boolean isWidth) {int result;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);int padding = isWidth ? getPaddingLeft() + getPaddingRight() : getPaddingTop() + getPaddingBottom();if (mode == MeasureSpec.EXACTLY) {result = size;} else {result = isWidth ? getSuggestedMinimumWidth() : getSuggestedMinimumHeight();result += padding;if (mode == MeasureSpec.AT_MOST) {if (isWidth) {result = Math.max(result, size);} else {result = Math.min(result, size);}}}return result;}@Overrideprotected void onDraw(Canvas canvas) {if (mIfDrawText) {calculateDrawRectF();} else {calculateDrawRectFWithoutProgressText();}if (mDrawReachedBar) {canvas.drawRect(mReachedRectF, mReachedBarPaint);}if (mDrawUnreachedBar) {canvas.drawRect(mUnreachedRectF, mUnreachedBarPaint);}if (mIfDrawText)canvas.drawText(mCurrentDrawText, mDrawTextStart, mDrawTextEnd, mTextPaint);}private void initializePainters() {mReachedBarPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mReachedBarPaint.setColor(mReachedBarColor);mUnreachedBarPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mUnreachedBarPaint.setColor(mUnreachedBarColor);mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mTextPaint.setColor(mTextColor);mTextPaint.setTextSize(mTextSize);}private void calculateDrawRectFWithoutProgressText() {mReachedRectF.left = getPaddingLeft();mReachedRectF.top = getHeight() / 2.0f - mReachedBarHeight / 2.0f;mReachedRectF.right = (getWidth() - getPaddingLeft() - getPaddingRight()) / (getMax() * 1.0f) * getProgress()+ getPaddingLeft();mReachedRectF.bottom = getHeight() / 2.0f + mReachedBarHeight / 2.0f;mUnreachedRectF.left = mReachedRectF.right;mUnreachedRectF.right = getWidth() - getPaddingRight();mUnreachedRectF.top = getHeight() / 2.0f + -mUnreachedBarHeight / 2.0f;mUnreachedRectF.bottom = getHeight() / 2.0f + mUnreachedBarHeight / 2.0f;}private void calculateDrawRectF() {mCurrentDrawText = String.format("%d", getProgress() * 100 / getMax());mCurrentDrawText = mPrefix + mCurrentDrawText + mSuffix;mDrawTextWidth = mTextPaint.measureText(mCurrentDrawText);if (getProgress() == 0) {mDrawReachedBar = false;mDrawTextStart = getPaddingLeft();} else {mDrawReachedBar = true;mReachedRectF.left = getPaddingLeft();mReachedRectF.top = getHeight() / 2.0f - mReachedBarHeight / 2.0f;mReachedRectF.right = (getWidth() - getPaddingLeft() - getPaddingRight()) / (getMax() * 1.0f)* getProgress() - mOffset + getPaddingLeft();mReachedRectF.bottom = getHeight() / 2.0f + mReachedBarHeight / 2.0f;mDrawTextStart = (mReachedRectF.right + mOffset);}mDrawTextEnd = (int) ((getHeight() / 2.0f) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2.0f));if ((mDrawTextStart + mDrawTextWidth) >= getWidth() - getPaddingRight()) {mDrawTextStart = getWidth() - getPaddingRight() - mDrawTextWidth;mReachedRectF.right = mDrawTextStart - mOffset;}float unreachedBarStart = mDrawTextStart + mDrawTextWidth + mOffset;if (unreachedBarStart >= getWidth() - getPaddingRight()) {mDrawUnreachedBar = false;} else {mDrawUnreachedBar = true;mUnreachedRectF.left = unreachedBarStart;mUnreachedRectF.right = getWidth() - getPaddingRight();mUnreachedRectF.top = getHeight() / 2.0f + -mUnreachedBarHeight / 2.0f;mUnreachedRectF.bottom = getHeight() / 2.0f + mUnreachedBarHeight / 2.0f;}}/** * Get progress text color. * @return progress text color. */public int getTextColor() {return mTextColor;}/** * Get progress text size. * @return progress text size. */public float getProgressTextSize() {return mTextSize;}public int getUnreachedBarColor() {return mUnreachedBarColor;}public int getReachedBarColor() {return mReachedBarColor;}public int getProgress() {return mCurrentProgress;}public int getMax() {return mMaxProgress;}public float getReachedBarHeight() {return mReachedBarHeight;}public float getUnreachedBarHeight() {return mUnreachedBarHeight;}public void setProgressTextSize(float textSize) {this.mTextSize = textSize;mTextPaint.setTextSize(mTextSize);invalidate();}public void setProgressTextColor(int textColor) {this.mTextColor = textColor;mTextPaint.setColor(mTextColor);invalidate();}public void setUnreachedBarColor(int barColor) {this.mUnreachedBarColor = barColor;mUnreachedBarPaint.setColor(mReachedBarColor);invalidate();}public void setReachedBarColor(int progressColor) {this.mReachedBarColor = progressColor;mReachedBarPaint.setColor(mReachedBarColor);invalidate();}public void setReachedBarHeight(float height) {mReachedBarHeight = height;}public void setUnreachedBarHeight(float height) {mUnreachedBarHeight = height;}public void setMax(int maxProgress) {if (maxProgress > 0) {this.mMaxProgress = maxProgress;invalidate();}}public void setSuffix(String suffix) {if (suffix == null) {mSuffix = "";} else {mSuffix = suffix;}}public String getSuffix() {return mSuffix;}public void setPrefix(String prefix) {if (prefix == null)mPrefix = "";else {mPrefix = prefix;}}public String getPrefix() {return mPrefix;}public void incrementProgressBy(int by) {if (by > 0) {setProgress(getProgress() + by);}if (mListener != null) {mListener.onProgressChange(getProgress(), getMax());}}public void setProgress(int progress) {if (progress <= getMax() && progress >= 0) {this.mCurrentProgress = progress;invalidate();}}@Overrideprotected Parcelable onSaveInstanceState() {final Bundle bundle = new Bundle();bundle.putParcelable(INSTANCE_STATE, super.onSaveInstanceState());bundle.putInt(INSTANCE_TEXT_COLOR, getTextColor());bundle.putFloat(INSTANCE_TEXT_SIZE, getProgressTextSize());bundle.putFloat(INSTANCE_REACHED_BAR_HEIGHT, getReachedBarHeight());bundle.putFloat(INSTANCE_UNREACHED_BAR_HEIGHT, getUnreachedBarHeight());bundle.putInt(INSTANCE_REACHED_BAR_COLOR, getReachedBarColor());bundle.putInt(INSTANCE_UNREACHED_BAR_COLOR, getUnreachedBarColor());bundle.putInt(INSTANCE_MAX, getMax());bundle.putInt(INSTANCE_PROGRESS, getProgress());bundle.putString(INSTANCE_SUFFIX, getSuffix());bundle.putString(INSTANCE_PREFIX, getPrefix());bundle.putBoolean(INSTANCE_TEXT_VISIBILITY, getProgressTextVisibility());return bundle;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {if (state instanceof Bundle) {final Bundle bundle = (Bundle) state;mTextColor = bundle.getInt(INSTANCE_TEXT_COLOR);mTextSize = bundle.getFloat(INSTANCE_TEXT_SIZE);mReachedBarHeight = bundle.getFloat(INSTANCE_REACHED_BAR_HEIGHT);mUnreachedBarHeight = bundle.getFloat(INSTANCE_UNREACHED_BAR_HEIGHT);mReachedBarColor = bundle.getInt(INSTANCE_REACHED_BAR_COLOR);mUnreachedBarColor = bundle.getInt(INSTANCE_UNREACHED_BAR_COLOR);initializePainters();setMax(bundle.getInt(INSTANCE_MAX));setProgress(bundle.getInt(INSTANCE_PROGRESS));setPrefix(bundle.getString(INSTANCE_PREFIX));setSuffix(bundle.getString(INSTANCE_SUFFIX));setProgressTextVisibility(bundle.getBoolean(INSTANCE_TEXT_VISIBILITY) ? ProgressTextVisibility.Visible: ProgressTextVisibility.Invisible);super.onRestoreInstanceState(bundle.getParcelable(INSTANCE_STATE));return;}super.onRestoreInstanceState(state);}public float dp2px(float dp) {final float scale = getResources().getDisplayMetrics().density;return dp * scale + 0.5f;}public float sp2px(float sp) {final float scale = getResources().getDisplayMetrics().scaledDensity;return sp * scale;}public void setProgressTextVisibility(ProgressTextVisibility visibility) {mIfDrawText = visibility == ProgressTextVisibility.Visible;invalidate();}public boolean getProgressTextVisibility() {return mIfDrawText;}public void setOnProgressBarListener(OnProgressBarListener listener) {mListener = listener;}}

源码后续会给上....点击源码下载

0 0
原创粉丝点击