仿IOS圆形下载进度条
Posted 嘉禾世兴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仿IOS圆形下载进度条相关的知识,希望对你有一定的参考价值。
/** * Created by C058 on 2016/5/25. */ public class MyHoriztalProgressBar extends ProgressBar { private static final int DEFAULT_REACH_COLOR = 0xff24F569; private static final int DEFAULT_UNREACH_COLOR = 0xffC0C0C0; private static final int DEFAULT_REACH_HEIGHT = 1; private static final int DEFAULT_UNREACH_HEIGHT = 2; private static final int DEFAULT_TEXT_COLOR = DEFAULT_REACH_COLOR; private static final int DEFAULT_TEXT_SIZE = 12; private static final int DEFAULT_TEXT_OFFSET = 5; protected int mReachColor = DEFAULT_REACH_COLOR; protected int mUnReachColor = DEFAULT_UNREACH_COLOR; protected int mReachHeight = dp2px(DEFAULT_REACH_HEIGHT); protected int mUnReachHeight = dp2px(DEFAULT_UNREACH_HEIGHT); protected int mTextColor = DEFAULT_TEXT_COLOR; protected int mTextSize = sp2px(DEFAULT_TEXT_SIZE); protected int mTextOffset = dp2px(DEFAULT_TEXT_OFFSET); protected Paint mPaint = new Paint(); private int mRealWidth; public MyHoriztalProgressBar(Context context) { this(context, null); } public MyHoriztalProgressBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyHoriztalProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.MyHoriztalProgressBar); mReachColor = ta.getColor(R.styleable.MyHoriztalProgressBar_progressbar_reach_color, mReachColor); mUnReachColor = ta.getColor(R.styleable.MyHoriztalProgressBar_progressbar_unreach_color, mUnReachColor); mReachHeight = (int) ta.getDimension(R.styleable.MyHoriztalProgressBar_progressbar_reach_height, mReachHeight); mUnReachHeight = (int) ta.getDimension(R.styleable.MyHoriztalProgressBar_progressbar_unreach_height, mUnReachHeight); mTextColor = ta.getColor(R.styleable.MyHoriztalProgressBar_progressbar_text_color, mTextColor); mTextSize = (int) ta.getDimension(R.styleable.MyHoriztalProgressBar_progressbar_text_size, mTextSize); mTextOffset = (int) ta.getDimension(R.styleable.MyHoriztalProgressBar_progressbar_text_offset, mTextOffset); ta.recycle(); mPaint.setTextSize(mTextSize); } @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthVal = MeasureSpec.getSize(widthMeasureSpec); int heightVal = measureHeight(heightMeasureSpec); setMeasuredDimension(widthVal, heightVal); mRealWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); } @Override protected synchronized void onDraw(Canvas canvas) { //draw reachBar String text = getProgress() + "%"; int textWidth = (int) mPaint.measureText(text); boolean noNeedUnrechBar = false; canvas.save(); canvas.translate(getPaddingLeft(), getMeasuredHeight() / 2); float radio = getProgress() * 1.0f / getMax(); float progressX = mRealWidth * radio; if (progressX + textWidth > mRealWidth) { progressX = mRealWidth - textWidth; noNeedUnrechBar = true; } //draw reachbar mPaint.setColor(mReachColor); mPaint.setStrokeWidth(mReachHeight); float endX = progressX - mTextOffset / 2; canvas.drawLine(0, 0, endX, 0, mPaint); //draw text mPaint.setColor(mTextColor); float y = -(mPaint.descent() + mPaint.ascent())/2; canvas.drawText(text, progressX,y, mPaint); //draw unreachbar if (!noNeedUnrechBar) { mPaint.setColor(mUnReachColor); mPaint.setStrokeWidth(mUnReachHeight); float startX = progressX + textWidth + mTextOffset / 2; canvas.drawLine(startX, 0, mRealWidth, 0, mPaint); } canvas.restore(); } private int measureHeight(int heightMeasureSpec) { int mode = MeasureSpec.getMode(heightMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); int result = 0; if (mode == MeasureSpec.EXACTLY||mode == MeasureSpec.UNSPECIFIED) { result = height; } else if (mode == MeasureSpec.AT_MOST) { int textHeight = (int) (mPaint.descent() - mPaint.ascent()); result = getPaddingTop() + getPaddingBottom() + Math.max(Math.max(mReachHeight, mUnReachHeight), textHeight); // { // result = Math.min(result, height); // } } return result; } protected int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); } protected int sp2px(int sp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics()); } }
/** * Created by C058 on 2016/5/26. * 模仿ios app store应用下载圆形进图条 */ public class MyRoundProgressBar extends MyHoriztalProgressBar { private static final int DEFAULT_PROGRESS_RADIUS = 30; private int mRadius = dp2px(DEFAULT_PROGRESS_RADIUS); private int mInRadius; private RectF mRectf, mInRectf; public MyRoundProgressBar(Context context) { this(context, null); } public MyRoundProgressBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyRoundProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.MyRoundProgressBar); mRadius = (int) ta.getDimension(R.styleable.MyRoundProgressBar_progressbar_radius, mRadius); ta.recycle(); mReachHeight = mUnReachHeight * 2; mPaint.setAntiAlias(true);//抗锯齿 mPaint.setDither(true); //防抖动模式 mPaint.setStyle(Paint.Style.STROKE);//画笔风格设置为空心 mPaint.setStrokeCap(Paint.Cap.ROUND); } @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int diameter = mRadius * 2 + getPaddingLeft() + getPaddingRight() + mUnReachHeight * 2; //控件宽度 默认四个padding一致 int width = resolveSize(diameter, widthMeasureSpec); int height = resolveSize(diameter, heightMeasureSpec); int realWidth = Math.min(width, height);//当宽高设置不一致,取小的那个 //外圆的半径 mRadius = (realWidth - getPaddingLeft() - getPaddingRight() - mUnReachHeight) / 2; mRectf = new RectF(0, 0, mRadius * 2, mRadius * 2); //内圆的半径 mInRadius = mRadius - mUnReachHeight; mInRectf = new RectF(0, 0, mInRadius * 2, mInRadius * 2); setMeasuredDimension(realWidth, realWidth); } @Override protected synchronized void onDraw(Canvas canvas) { canvas.save(); canvas.translate(getPaddingLeft(), getPaddingTop()); //draw unreachbar mPaint.setColor(mUnReachColor); mPaint.setStrokeWidth(mUnReachHeight); //从圆点开始画圆 // canvas.drawCircle(mRadius, mRadius, mRadius, mPaint); //draw reachbar //将画布移动到画内圆的位置 canvas.translate(mUnReachHeight, mUnReachHeight); mPaint.setColor(mReachColor); mPaint.setStrokeWidth(mReachHeight); float sweepAngle = getProgress() * 1.0f / getMax() * 360; canvas.drawArc(mInRectf, -90, sweepAngle, false, mPaint); // //draw text // String text = getProgress() + "%"; // int textWidth = (int) mPaint.measureText(text); // int textHeight = (int) ((mPaint.descent() + mPaint.ascent()) / 2); // mPaint.setColor(mTextColor); // canvas.drawText(text, mRadius - textWidth / 2, mRadius - textHeight, mPaint); canvas.restore(); } }
<declare-styleable name="MyHoriztalProgressBar"> <attr name="progressbar_reach_color" format="color" /> <attr name="progressbar_unreach_color" format="color" /> <attr name="progressbar_reach_height" format="dimension" /> <attr name="progressbar_unreach_height" format="dimension" /> <attr name="progressbar_text_color" format="color" /> <attr name="progressbar_text_size" format="dimension" /> <attr name="progressbar_text_offset" format="dimension" /> </declare-styleable> <declare-styleable name="MyRoundProgressBar"> <attr name="progressbar_radius" format="dimension" /> </declare-styleable> <declare-styleable name="MyHoriztalProgressBar2"> <attr name="reach_color" format="color" /> <attr name="unreach_color" format="color" /> <attr name="progressbar_height" format="dimension" /> </declare-styleable>
new Timer().schedule(new TimerTask() { int currentIndex = (int) Math.floor(current * 100 / total); int sumIndex = 0; @Override public void run() { if (currentIndex > sumIndex) { sumIndex = currentIndex; LogHelp.i("polyv", "current:" + current + "-------total:" + total + "-------currentIndex:" + currentIndex); holder.videoList_progress.setProgress(sumIndex); } } }, 200, 200);
以上是关于仿IOS圆形下载进度条的主要内容,如果未能解决你的问题,请参考以下文章