android 自定义圆环

android 自定义圆环

最近学了自定义控件,以前一直想写个圆环,最近粗粗写了个,以便记录.

public class RingProgressView extends View {

    private float radius = 200; //圆半径
    private float distance = 60;// 圆环

    private Paint mCirclePaint;
    private Paint textPaint;

    private int vWidth, vHeight;

    private RectF mRectF;

    private int curProgress = 0;
    private int oldProgress = 0;

    private float textOffsetY;

    private float vX, vY; //绘制的中心点

    private String text = "0";

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

    public RingProgressView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //自定义属性的话可以自己找找attrs属性
        initPaint();
    }

    private void initPaint() {
        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
        mCirclePaint.setStrokeCap(Paint.Cap.ROUND);

        textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        textPaint.setColor(Color.WHITE);
        textPaint.setTextSize(30);
        textPaint.setTextAlign(Paint.Align.CENTER);

        textOffsetY = (textPaint.descent() + textPaint.ascent()) / 2;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //测绘视图的大小
        vWidth = resolveSize((int) (radius * 2), widthMeasureSpec);
        vHeight = resolveSize((int) (radius * 2), heightMeasureSpec);

        int thisX = vWidth - getPaddingLeft() - getPaddingRight();
        int thisY = vHeight - getPaddingTop() - getPaddingBottom();
        vX = thisX / 2;
        vY = thisY / 2;

        //当前圆直径大于视图时候  改变圆的大小
        if (vWidth < radius * 2 || vHeight < radius * 2) {
            if (thisX > thisY) {
                radius = thisY / 2;
            } else {
                radius = thisX / 2;
            }
        }

        //更改之后  改变圆环大小
        if (radius != 200)
            distance = radius / 6;

        //自定义之后必须调用这个
        setMeasuredDimension(vWidth, vHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        //绘制实心圆,中心圆的颜色
        mCirclePaint.setStrokeWidth(0);
        mCirclePaint.setStyle(Paint.Style.FILL);
        mCirclePaint.setColor(0xFFF29B76);
        canvas.drawCircle(vX, vY, radius, mCirclePaint);

        //先绘制底部的360圆环,然后绘制滑动的圆环
        mCirclePaint.setStyle(Paint.Style.STROKE);
        mCirclePaint.setColor(Color.YELLOW);
        mCirclePaint.setStrokeWidth(distance);
        mRectF = new RectF(vX - radius + distance / 2, vY - radius + distance / 2, vX + radius - distance / 2, vY + radius - distance / 2);//定义一个矩形区域  

        canvas.drawArc(mRectF, 0, 360, false, mCirclePaint);

        mCirclePaint.setColor(0xDDD12345);
        canvas.drawArc(mRectF, -90, oldProgress, false, mCirclePaint);

        //绘制百分比文字
        canvas.drawText(text + "%", vX, vY - textOffsetY, textPaint);
    }

    public synchronized void setProgress(double progress) {
        oldProgress = curProgress;
        curProgress = (int) (progress * 360);
        myHandler.removeCallbacksAndMessages(null);
        if (oldProgress != curProgress)
            oldProgress = 0;
        myHandler.sendMessageDelayed(new Message(), 2);
    }

    private Handler myHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            if (curProgress < oldProgress) {
                removeCallbacksAndMessages(this);
            } else if (curProgress >= oldProgress) {
                oldProgress += 3;

                if (oldProgress > curProgress)
                    oldProgress = curProgress;

                text = String.format("%.1f", oldProgress / 3.6);
                invalidate();
                myHandler.sendMessageDelayed(new Message(), 1);
            }
        }
    };

    //可以设置圆环的一些属性
    public void setRadius() {
        //xxx
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值