[Android][自定义进度条]④--圆形进度条的onMeasure

参考地址

http://sumile.cn/archives/1523.html

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="progress_unreach_color" format="color"/>
    <attr name="progress_unreach_height" format="dimension"/>
    <attr name="progress_reach_color" format="color"/>
    <attr name="progress_reach_height" format="dimension"/>
    <attr name="progress_text_color" format="color"/>
    <attr name="progress_text_size" format="dimension"/>
    <attr name="progress_text_offset" format="dimension"/>

    <declare-styleable name="HorizontalProgressbarWithProgress">
        <attr name="progress_unreach_color" />
        <attr name="progress_unreach_height"/>
        <attr name="progress_reach_color" />
        <attr name="progress_reach_height" />
        <attr name="progress_text_color" />
        <attr name="progress_text_size" />
        <attr name="progress_text_offset" />
    </declare-styleable>

    <declare-styleable name="RoundProgressBarWithProgress">
        <attr name="radius" format="dimension"/>

    </declare-styleable>
</resources>
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.util.AttributeSet;

/**
 * Created by TONG on 2017/3/25.
 */

public class RoundProgressBarWithProgress extends HorizontalProgressbarWithProgress{

    private int mRadius=dp2px(30);

    private int mMaxPaintWidth;

    public RoundProgressBarWithProgress(Context context) {
        this(context,null);
    }

    public RoundProgressBarWithProgress(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public RoundProgressBarWithProgress(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        mReachHeight= (int) (mUnReachHeight*2.5f);

        TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.RoundProgressBarWithProgress);
        mRadius= (int) ta.getDimension(R.styleable.RoundProgressBarWithProgress_radius,mRadius);
        ta.recycle();

        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setStrokeCap(Paint.Cap.ROUND);

    }

    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mMaxPaintWidth=Math.max(mReachHeight,mUnReachHeight);
        //默认四个padding一致
        int expect=mRadius*2+mMaxPaintWidth+getPaddingLeft()+getPaddingRight();

        //设置默认warp_content大小
        int width=resolveSize(expect,widthMeasureSpec);
        int height=resolveSize(expect,heightMeasureSpec);

        int readWidth=Math.min(width,height);

        mRadius=(readWidth-getPaddingLeft()-getPaddingRight()-mMaxPaintWidth)/2;

        setMeasuredDimension(readWidth,readWidth);

    }
}

推荐阅读更多精彩内容