美文网首页
自定义View - 9.圆形进度条

自定义View - 9.圆形进度条

作者: zsj1225 | 来源:发表于2018-06-24 16:39 被阅读41次
oyijc-44uv6.gif

1.自定义属性

首先有没有自定义属性,比如这里的圆环的宽度,外圆的颜色,中间文字的大小和颜色都不是写死的,所以需要自定义属性

<resources>
    <declare-styleable name="ProgressBar">
        <!--圆环宽度-->
        <attr name="ringWidth" format="dimension" />
        <!--外圆颜色-->
        <attr name="outCircleColor" format="color" />
        <!--进度圆颜色-->
        <attr name="innerCircleColor" format="color" />
        <!--中间文字的大小-->
        <attr name="centerTextSize" format="dimension" />
        <!--中间文字的颜色-->
        <attr name="centerTextColor" format="color" />
    </declare-styleable>
</resources>
       public ProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        //获取自定义属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ProgressBar);
        mRingWidth = typedArray.getDimensionPixelOffset(R.styleable.ProgressBar_ringWidth,
                DimenUtils.dip2px(context, mRingWidth));
        mOutCircleColor = typedArray.getColor(R.styleable.ProgressBar_outCircleColor, mOutCircleColor);
        mInnerCircleColor = typedArray.getColor(R.styleable.ProgressBar_innerCircleColor, mInnerCircleColor);
        mCenterTextSize = typedArray.getDimensionPixelOffset(R.styleable.ProgressBar_centerTextSize,
                DimenUtils.dip2px(context, mCenterTextSize));
        mCenterTextColor = typedArray.getColor(R.styleable.ProgressBar_centerTextColor, mCenterTextColor);
        typedArray.recycle();
    }

2. 测量

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //默认大小
        int defaultSize = DimenUtils.dip2px(getContext(), 100);
        //宽度
        //获取模式
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        //获取大小
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        //包裹内容
        if (widthMode == MeasureSpec.AT_MOST) {
            widthSize = defaultSize;
        }
        //高度
        //获取模式
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        //获取大小
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        //包裹内容
        if (heightMode == MeasureSpec.AT_MOST) {
            heightSize = defaultSize;
        }
        //宽高要一致
        int progressSize = Math.min(widthSize, heightSize);

        //设置宽高
        setMeasuredDimension(progressSize, progressSize);
    }

3.绘制

3.1 绘制外圆

    @Override
    protected void onDraw(Canvas canvas) {
        // 1.绘制外圆
        int cx = getWidth() / 2;
        int cy = getHeight() / 2;
        float radius = getWidth() / 2 - mRingWidth / 2;
        canvas.drawCircle(cx, cy, radius, mOutCirclePaint);
     }

3.2 绘制进度圆

  @Override
    protected void onDraw(Canvas canvas) {

        //2.绘制进度圆
        float currentProgress = (float) (mCurrentPercentage * 360);
        if (mOval == null) {
            mOval = new RectF(mRingWidth / 2, mRingWidth / 2,
                    getWidth() - mRingWidth / 2, getHeight() - mRingWidth / 2);
        }
        canvas.drawArc(mOval, 0, currentProgress, false, mInnerCirclePaint);
    }

3.3 绘制中间文本

    protected void onDraw(Canvas canvas) {
        //3.绘制中间文本
        String text = (int) (mCurrentPercentage * 100) + "%";
        //字体的宽度高度
        if (mBounds == null) {
            mBounds = new Rect();
        }
        mCenterTextPaint.getTextBounds(text, 0, text.length(), mBounds);
        float x = getWidth() / 2 - mBounds.width() / 2;
        //知道中间位置求基线位置
        Paint.FontMetricsInt fontMetricsInt = mCenterTextPaint.getFontMetricsInt();
        //指定中间位置,绘制文本
        int baseLine = getHeight() / 2 + (fontMetricsInt.bottom - fontMetricsInt.top) / 2 - fontMetricsInt.bottom;
        canvas.drawText(text, x, baseLine, mCenterTextPaint);
    }

完整代码:progressbar

相关文章

  • Android-自定义进度条

    ProgressBar 参考文章:Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)and...

  • iOS 制作个圆形进度条

    1.需要做个这样的圆形进度条 自定义弹窗view就不说了,主要是这个圆形进度view,底色是灰色然后有进度灰色被...

  • Android 自定义圆形进度条

    Android简易的圆形进度条 自定义View基础入门看2个系列文章,非常优秀的文章。安卓自定义View教程目录H...

  • 自定义View - 9.圆形进度条

    1.自定义属性 首先有没有自定义属性,比如这里的圆环的宽度,外圆的颜色,中间文字的大小和颜色都不是写死的,所以需要...

  • Android常用控件之ProgressBar,圆形进度条

    目录:android.widget.ProgressBar 前言:中间带百分比的圆形进度条xml布局 自定义view:

  • Android圆形进度条自定义

    自定义圆形进度条 实现 圆形进度条api 使用 将MyCircleProgressView和attrs.xml下的...

  • android 圆形进度条

    圆形的进度条,自定义控件实现

  • 自定义View实战四:圆形进度条

    本文介绍自定义圆形进度条的实现,主要利用自定义 View 和动画相关知识。 下面是效果图 实现步骤分析准备好外层圆...

  • ProgressBar

    普通进度条 样式 圆形和水平【默认圆形】 自定义水平进度条 在这个Style中,有一个progressDrawab...

  • 自定义View 圆形进度条

    目录 效果 按照惯例,放上效果图 前言 上一篇 文章把断点续传的功能分享了一下,有兴趣的朋友可以看一看。接下来就给...

网友评论

      本文标题:自定义View - 9.圆形进度条

      本文链接:https://www.haomeiwen.com/subject/msqsyftx.html