亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android 自定義ProgressBar顯示百分比

2019-11-08 00:22:57
字體:
來源:轉載
供稿:網友

首先貼一張可愛的Google Doodle: 這里寫圖片描述

自定義PRogressBar顯示百分比,效果圖:

這里寫圖片描述

代碼實現:

package com.demo.progressbarwithpercent.view;import com.demo.progressbarwithpercent.R;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;public class ProgressBarWithPercent 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 ProgressBarWithPercent(Context context) { this(context, null); } public ProgressBarWithPercent(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ProgressBarWithPercent(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.ProgressBarWithPercent, defStyleAttr, 0); mReachedBarColor = attributes.getColor( R.styleable.ProgressBarWithPercent_progress_reached_color, default_reached_color); mUnreachedBarColor = attributes.getColor( R.styleable.ProgressBarWithPercent_progress_unreached_color, default_unreached_color); mTextColor = attributes.getColor( R.styleable.ProgressBarWithPercent_progress_text_color, default_text_color); mTextSize = attributes.getDimension( R.styleable.ProgressBarWithPercent_progress_text_size, default_text_size); mReachedBarHeight = attributes.getDimension( R.styleable.ProgressBarWithPercent_progress_reached_bar_height, default_reached_bar_height); mUnreachedBarHeight = attributes .getDimension( R.styleable.ProgressBarWithPercent_progress_unreached_bar_height, default_unreached_bar_height); mOffset = attributes.getDimension( R.styleable.ProgressBarWithPercent_progress_text_offset, default_progress_text_offset); int textVisible = attributes.getInt( R.styleable.ProgressBarWithPercent_progress_text_visibility, PROGRESS_TEXT_VISIBLE); if (textVisible != PROGRESS_TEXT_VISIBLE) { mIfDrawText = false; } setProgress(attributes.getInt( R.styleable.ProgressBarWithPercent_progress_current, 0)); setMax(attributes.getInt( R.styleable.ProgressBarWithPercent_progress_max, 100)); attributes.recycle(); initializePainters(); } @Override protected int getSuggestedMinimumWidth() { return (int) mTextSize; } @Override protected int getSuggestedMinimumHeight() { return Math.max((int) mTextSize, Math.max((int) mReachedBarHeight, (int) mUnreachedBarHeight)); } @Override protected 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; } @Override protected 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(mUnreachedBarColor); 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(); } } @Override protected 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; } @Override protected 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; }}

代碼正在上傳,稍后更新。 源碼下載: ProgressBarWithPercent


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合久久天天综线观看| 欧美激情xxxx性bbbb| 91精品视频在线| 91精品国产91| 最新中文字幕亚洲| 国产精品69久久| 国产成人jvid在线播放| 日韩中文字幕免费视频| 日韩视频在线免费观看| 欧美一区视频在线| 中文字幕亚洲欧美日韩高清| 国产精品视频一区二区高潮| 亚洲国产精品人久久电影| 欧美人与性动交a欧美精品| 久久国产精品影片| 国产精品永久免费视频| 色伦专区97中文字幕| 国产精品第100页| 成人夜晚看av| 亚洲激情在线观看| 国产日产久久高清欧美一区| 国产中文欧美精品| 久久99国产精品久久久久久久久| 国产精品大陆在线观看| 国产亚洲a∨片在线观看| 日韩动漫免费观看电视剧高清| 精品国产1区2区| 亚洲xxx大片| 国产精品成人免费视频| 亚洲最大成人网色| 国产成人精品一区二区在线| 在线看福利67194| 91精品国产高清久久久久久久久| 亚洲欧美日韩区| 最近2019好看的中文字幕免费| 国产香蕉97碰碰久久人人| 91精品综合视频| 亚洲欧洲av一区二区| 超在线视频97| 日韩av电影免费观看高清| 色一区av在线| 欧美精品少妇videofree| 91国产精品电影| 91精品国产沙发| 成人免费自拍视频| 亚洲久久久久久久久久久| 国内精品模特av私拍在线观看| 欧美福利在线观看| 欧美不卡视频一区发布| 国产精品日日摸夜夜添夜夜av| 美女少妇精品视频| 久久国产精品99国产精| 亚洲精品电影在线观看| 欧美电影在线免费观看网站| 岛国av在线不卡| 国产精品揄拍一区二区| 国内精品久久久久久久久| 国产97在线|亚洲| 欧美精品电影免费在线观看| 久久久久久国产免费| 国产精品小说在线| 91黄色8090| 亚洲天堂av女优| 久久国产精品电影| 亚洲国产精品中文| 伊人青青综合网站| 国产精品美女网站| 欧美韩国理论所午夜片917电影| 日韩黄色在线免费观看| 国产亚洲xxx| 亚洲综合在线播放| 国产精品欧美日韩久久| 欧美成人三级视频网站| 精品女厕一区二区三区| 日韩少妇与小伙激情| 国产精品白丝jk喷水视频一区| 久99九色视频在线观看| 欧美日韩免费看| 91av免费观看91av精品在线| 中文字幕av日韩| 日本欧美一级片| 国产在线播放91| 狠狠躁18三区二区一区| 欧美成人午夜激情| 亚洲电影天堂av| 日韩成人在线网站| 91精品国产成人| 久久久91精品国产| 色系列之999| 久99久在线视频| 不卡在线观看电视剧完整版| 亚洲欧美综合精品久久成人| 欧美大片在线看免费观看| 欧美亚洲第一区| 97视频在线观看免费| 欧美黄色三级网站| 国产精品久久9| 国产一区深夜福利| 8x海外华人永久免费日韩内陆视频| 亚洲国产日韩精品在线| 色噜噜狠狠色综合网图区| 久久久久久噜噜噜久久久精品| 久久91亚洲精品中文字幕奶水| 亚洲视频精品在线| 欧美激情第99页| 欧美精品在线免费观看| 日韩中文字幕精品视频| 97人人做人人爱| 国产精品久久久久久av| 2019最新中文字幕| 在线观看日韩av| 亚洲欧美综合区自拍另类| 亚洲天堂免费视频| 亚洲欧美www| 日韩精品在线第一页| 精品久久久久人成| 久久免费精品日本久久中文字幕| 在线午夜精品自拍| 亚洲毛片在线免费观看| 91免费国产网站| 欧美激情一区二区三区成人| 久久久久久中文| 国产精品扒开腿做爽爽爽视频| 欧美电影免费在线观看| 日韩精品免费在线播放| 亚洲国产精品电影在线观看| 日韩精品在线视频| 日韩av资源在线播放| 成人有码视频在线播放| 海角国产乱辈乱精品视频| 久久精品99国产精品酒店日本| 久久久综合av| 在线视频中文亚洲| 欧美性极品xxxx做受| 国内揄拍国内精品少妇国语| 亚洲国产日韩欧美综合久久| 国产日产欧美a一级在线| 亚洲第一精品夜夜躁人人躁| 日本欧美在线视频| 97久久久免费福利网址| 97超视频免费观看| 97久久精品人人澡人人爽缅北| 久99九色视频在线观看| 亚洲久久久久久久久久| 国产一区二区三区视频在线观看| 日韩成人激情视频| 97视频在线观看亚洲| 欧美人与性动交a欧美精品| 免费97视频在线精品国自产拍| 欧美理论片在线观看| 亚洲视频在线观看网站| 91精品中文在线| 狠狠色狠狠色综合日日小说| 国产亚洲激情视频在线| 国产成人jvid在线播放| 亚洲在线免费观看| 久久久久国产精品免费| 国产综合在线看| 中文字幕日韩欧美精品在线观看| 国产成人精品在线播放| 亚洲综合视频1区| 日韩电视剧在线观看免费网站| 国产拍精品一二三| 一本一道久久a久久精品逆3p|