• 仿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);
  • 相关阅读:
    计数排序
    epel
    Web开发:我希望得到的编程学习路线图
    第五章:if语句与运算符
    java web学习建议
    第四章:c++数据类型
    第二章:做一个最简单的c++程序
    linux的商业应用
    第三章:初步了解函数
    解析Linux商业应用现状
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5827747.html
Copyright © 2020-2023  润新知