zoukankan      html  css  js  c++  java
  • Android进度条学习

    自定义属性

        <!--
        roundColor 圆环的颜色
    
        roundProgressColor 进度的颜色
    
        roundWidth 圆环的宽度
    
        textColor 文字颜色
    
        textSize  文字大小
    
        max 最大值
    
        textIsDisplayable  是否显示进度文本
    
    
        style 样式
        STROKE 空心
        FILL 实心
        -->
    
        <declare-styleable name="RoundProgressBar">
            <attr name="roundColor" format="color"/>
            <attr name="roundProgressColor" format="color"/>
            <attr name="roundWidth" format="dimension"></attr>
            <attr name="textColor" format="color" />
            <attr name="textSize" format="dimension" />
            <attr name="max" format="integer"></attr>
            <attr name="textIsDisplayable" format="boolean"></attr>
            <attr name="style">
                <enum name="STROKE" value="0"></enum>
                <enum name="FILL" value="1"></enum>
            </attr>
        </declare-styleable>
    public RoundProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mPaint = new Paint();
    
            /**
             * 获取自定义的属性
             */
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);
    
            //底色
            mRoundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);
            //进度的颜色
            mRoundProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.BLUE);
            //圆形的宽
            mRoundWidth = typedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 20);
    
            //字体颜色 中间
            mTextColor = typedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.BLUE);
    
            //中间进度显示的字体大小
            mTextSize = typedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);
    
            //最大值
            mMax = typedArray.getInteger(R.styleable.RoundProgressBar_max, 100);
    
            //文字是否显示
            mTextIsDisplayable = typedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);
    
            //实心或者 空心
            mStyle = typedArray.getInt(R.styleable.RoundProgressBar_style, 0);
    
    
            typedArray.recycle();
    
        }

    绘制

            //圆心
            int centerOfCircle = getWidth() / 2;
            //radius 半径
            int radius = (int) (centerOfCircle - mRoundWidth / 2);
    
    
            //设置画笔
            mPaint.setAntiAlias(true);
            //圆环的颜色
            mPaint.setColor(mRoundColor);
    
            //设置空心
            mPaint.setStyle(Paint.Style.STROKE);
    
            //画笔宽度
            mPaint.setStrokeWidth(mRoundWidth);
    
            //画圆
            canvas.drawCircle(centerOfCircle, centerOfCircle, radius, mPaint);
    
    
            /**
             * 画百分比
             */
            mPaint.setStrokeWidth(0);
            //字体大小
            mPaint.setTextSize(mTextSize);
            //画笔颜色
            mPaint.setColor(mTextColor);
            //字体
            mPaint.setTypeface(Typeface.DEFAULT_BOLD);
    
            //计算百分比
            int percent = (int) (((float) mProgress / (float) mMax) * 100);
    
            //测量字体的宽度
            float textWidth = mPaint.measureText(percent + "%");
            //判断是否显示进度文字 不是0,风格是空心的
            if (mTextIsDisplayable && percent != 0 && mStyle == STROKE) {
    
                canvas.drawText(percent + "%", centerOfCircle - textWidth / 2, centerOfCircle + textWidth / 2, mPaint);
            }
    
    
            /**
             * 设置进度
             */
            mPaint.setColor(mRoundProgressColor);
            //画笔宽度
            mPaint.setStrokeWidth(mRoundWidth);
            mPaint.setAntiAlias(true);
    
    
            RectF oval = new RectF(centerOfCircle - radius, centerOfCircle - radius, centerOfCircle + radius, centerOfCircle + radius);
    
    
            switch (mStyle) {
    
                case STROKE:
                    //空心
                    mPaint.setStyle(Paint.Style.STROKE);
                    //画圆弧
    
                    /**
                     *
                     *开始的角度
                     */
                    canvas.drawArc(oval, 180, 360 * mProgress / mMax, false, mPaint);
                    break;
                case FILL:
                    //实心
                    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
                    //画圆弧
                    if(mProgress!=0) {
                        canvas.drawArc(oval, 180, 360 * mProgress / mMax, true, mPaint);
                    }
                    break;
            }

    源码:

    https://github.com/ln0491/ProgressDemo

  • 相关阅读:
    mysql 索引学习笔记
    mysql mysqli pdo学习总结
    Flask-Login的实现
    Flask配置方法
    Flask-SQLAlchemy使用方法
    alpha阶段绩效考核
    Alpha版本后的心得体会
    代码及数据库展示
    功能简介
    最新的用户需求分析
  • 原文地址:https://www.cnblogs.com/liunanjava/p/5771006.html
Copyright © 2011-2022 走看看