自定义CircleProgressView控件

来源:互联网 发布:电脑文件夹同步软件 编辑:程序博客网 时间:2024/06/03 21:55

1.思路:

1.自定义中间的圆形,2.自定义中间显示的文字;3.自定义外圈的弧线。

2.代码实现:

package com.best.keke.circleprogressdemo;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.util.Log;import android.view.View;/** * Created by keke on 2016/5/29. */public class CircleProgressView extends View {    private int widthMeasure;    private int heightMeasure;    private RectF arcRect;  // 弧线的矩形区域    private float sweepAngle;  //圆弧扫过的角度    private float sweepValues = 68;    private Paint arcPaint;     // 创建圆弧的画笔样式    private float circleXY; // 圆的x/y坐标    private float radius;   // 圆的半径    private Paint circlePaint;  // 画圆的画笔    private String drawText;   // 写的文字    private float textSize; // 文字的大小    private Paint textPaint;   // 文字的画笔    public CircleProgressView(Context context) {        super(context);    }    public CircleProgressView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public CircleProgressView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        widthMeasure = MeasureSpec.getSize(widthMeasureSpec);        heightMeasure = MeasureSpec.getSize(heightMeasureSpec);        Log.e("tag","宽:"+widthMeasure + "高:" + heightMeasure + "");        setMeasuredDimension(widthMeasure, heightMeasure);        // 初始化数据        initView();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        /**         * 弧线         * @param oval  指定圆弧的外轮廓矩形区域         * @param startAngle    圆弧起始角度,单位为度         * @param sweepAngle    圆弧扫过的角度,顺时针方向,单位为度         * @param useCenter true 表示在绘制圆弧的时候将圆心包括在内,可以用来绘制扇形,false类似空心圆管状         * @param paint 画笔         */        canvas.drawArc(arcRect, 150, sweepAngle, false, arcPaint);        /**         * 圆         * @param cx     圆心x坐标         * @param cy     圆心y坐标         * @param radius  半径         * @param paint  画笔         */        canvas.drawCircle(circleXY, circleXY, radius, circlePaint);        /**         * 文字         * @param text  显示的文字         * @param start  第一个文字的起始位置         * @param end     最后一个文字结束的位置         * @param x     文字的X坐标         * @param y     文字基线的y坐标         * @param paint  画笔         */        canvas.drawText(drawText, 0, drawText.length(), circleXY,                circleXY + (textSize / 4), textPaint);    }    private void initView() {        float length = 0;        if (heightMeasure >= widthMeasure) {            length = widthMeasure;        } else {            length = heightMeasure;        }        // 定义弧形的外接矩形的坐标        arcRect = new RectF(                (float) (length * 0.1),                (float) (length * 0.1),                (float) (length * 0.9),                (float) (length * 0.9));        sweepAngle = (sweepValues / 100f) * 360f;        Log.i("tag","角度:"+String.valueOf(sweepAngle));        arcPaint = new Paint();        arcPaint.setAntiAlias(true);    // 消除锯齿        arcPaint.setStrokeWidth((float) (length * 0.1));    // 设置划线的线宽        arcPaint.setColor(Color.BLUE);        arcPaint.setStyle(Paint.Style.STROKE);  // 设置画笔空心        circleXY = length / 2;        Log.i("tag","length:"+String.valueOf(length));        Log.i("tag","圆心坐标:"+String.valueOf(circleXY));        radius = (float) ((length * 0.5) / 2);        Log.i("tag","半径:"+String.valueOf(radius));        circlePaint = new Paint();        circlePaint.setAntiAlias(true);        circlePaint.setColor(Color.GREEN);        drawText = setText();        textSize = setTextSize();        textPaint = new Paint();        textPaint.setTextSize(textSize);        textPaint.setTextAlign(Paint.Align.CENTER);    }    /**     * 设置显示的文字的大小     *     * @return     */    private float setTextSize() {        this.invalidate();        return 40;    }    /**     * 设置显示的文字     *     * @return     */    private String setText() {        this.invalidate();  // 更新显示        return "keke_come on";    }    /**     * 给扇形的大小进行赋值     * @param sweepValues     */    public void setSweepValues(float sweepValues) {        if (sweepValues != 0) {            sweepValues = sweepValues;        } else {            sweepValues = 30;        }        this.invalidate();    }}
public class MainActivity extends AppCompatActivity {    private CircleProgressView circleProgress;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        circleProgress = (CircleProgressView) findViewById(R.id.circleProgress);        circleProgress.setSweepValues(10);    }}

3.效果展示:

这里写图片描述

0 0
原创粉丝点击