仿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圆形下载进度条的主要内容,如果未能解决你的问题,请参考以下文章

简单的圆形下载进度条

仿苹果AppStore 下载进度条

iOS 制作个圆形进度条

如何重新加载圆形进度条

iOS 环形下载进度条

IOS 圆形进度条