安卓自定义圆环进度

/**
 * 一个圆形百分比进度的自定义View
 */
public class CustomCirclePercentView extends View {

    /** 圆的半径*/
    private float mRadius;
    /** 色带的宽度*/
    private float mStripeWidth;
    /** 总体宽高大小*/
    private int mHeight;
    private int mWidth;
    /** 动画位置百分比进度*/
    private int mCurPercent;
    /** 实际百分比进度*/
    private int mPercent;
    /** 圆心坐标*/
    private float x;
    private float y;
    /** 要画的弧度*/
    private int mEndAngle;
    /** 小圆的颜色  圆环*/
    private int mSmallColor;
    /** 大圆颜色*/
    private int mBigColor;
    /** 中心百分比文字大小*/
    private float mCenterTextSize;
    /** 传入的百分比参数是否大于零的标记、用来控制是否开始画自定义view*/
    private boolean flag;
    /** 定义一个圆环动画结束的标记*/
    private boolean endFlag;
    private int BWScreenWidth;
    private int BWScreenHeight;

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

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

    public CustomCirclePercentView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomCirclePercentView, defStyleAttr, 0);
        mStripeWidth = a.getDimension(R.styleable.CustomCirclePercentView_stripeWidth, CommonUtils.dpToPx(30, context));
        mCurPercent = a.getInteger(R.styleable.CustomCirclePercentView_percent, 0);
        mSmallColor = a.getColor(R.styleable.CustomCirclePercentView_smallColor,0xffafb4db);
        mBigColor = a.getColor(R.styleable.CustomCirclePercentView_bigColor,0xff6950a1);
        mCenterTextSize = a.getDimensionPixelSize(R.styleable.CustomCirclePercentView_centerTextSize,CommonUtils.spToPx(20,context));
        mRadius = a.getDimensionPixelSize(R.styleable.CustomCirclePercentView_radius,CommonUtils.dpToPx(100,context));
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //获取测量模式
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        //获取测量大小
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) {
            mRadius = widthSize / 2;
            x = widthSize / 2;
            y = heightSize / 2;
            mWidth = widthSize;
            mHeight = heightSize;
        }

        if(widthMode == MeasureSpec.AT_MOST&&heightMode ==MeasureSpec.AT_MOST){
            mWidth = (int) (mRadius*2);
            mHeight = (int) (mRadius*2);
            x = mRadius;
            y = mRadius;

        }
//        setMeasuredDimension(BWScreenWidth, BWScreenHeight);
        setMeasuredDimension(mWidth,mHeight);
    }

//    public void setWidthHeight(int width, int height) {
//        this.BWScreenHeight = height;
//        this.BWScreenWidth = width;
//    }

    @Override
    protected void onDraw(Canvas canvas) {

        if(!flag){
            mEndAngle = 0;
        }else{
            mEndAngle = (int) (mCurPercent * 3.6);
        }
        //绘制大圆
        Paint bigCirclePaint = new Paint();
        bigCirclePaint.setAntiAlias(true);
        bigCirclePaint.setColor(mBigColor);

        canvas.drawCircle(x, y, mRadius, bigCirclePaint);


        //饼状图
        Paint sectorPaint = new Paint();
        sectorPaint.setColor(mSmallColor);
        sectorPaint.setAntiAlias(true);
        RectF rect = new RectF(0, 0, mWidth, mHeight);

        canvas.drawArc(rect,270, mEndAngle, true, sectorPaint);


        //绘制小圆,颜色透明
        Paint smallCirclePaint = new Paint();
        smallCirclePaint.setAntiAlias(true);
//        smallCirclePaint.setColor(mBigColor);Color.parseColor("#F5F5F5")
        smallCirclePaint.setColor(Color.parseColor("#FFFFFF")); //小圆设置为和activity一样的色值
        canvas.drawCircle(x, y, mRadius - mStripeWidth, smallCirclePaint);


        //绘制文本
//        Paint textPaint = new Paint();
//        String text = mCurPercent + "%";
//
//        textPaint.setTextSize(mCenterTextSize);
//        float textLength = textPaint.measureText(text);
//
//        textPaint.setColor(Color.WHITE);
//        canvas.drawText(text, x - textLength/2, y, textPaint);


        if(flag){ //TODO 用于圆环开始时画的圆圈
            float pointX = x;
            float pointY = y - mRadius + (mStripeWidth/2);
            Paint pointCirclePaint = new Paint();
            pointCirclePaint.setAntiAlias(true);
            pointCirclePaint.setColor(mSmallColor);
            canvas.drawCircle(pointX, pointY, mStripeWidth/2, pointCirclePaint);
        }

        if(endFlag && flag){ //TODO 用于圆环结束时画的圆圈
            float pointX = (float) (x + (mRadius - mStripeWidth/2) * Math.cos((mEndAngle - 90)*3.14/180));
            float pointY = (float) (y + (mRadius - mStripeWidth/2) * Math.sin((mEndAngle - 90)*3.14/180));
            Paint pointCirclePaint = new Paint();
            pointCirclePaint.setAntiAlias(true);
            pointCirclePaint.setColor(mSmallColor);
            canvas.drawCircle(pointX, pointY, mStripeWidth/2, pointCirclePaint);
        }
    }

    public void setPercent(int percent) { //TODO 外部设置百分比数
        if (percent > 100) {
            throw new IllegalArgumentException("percent must less than 100!");
        }
        setCurPercent(percent);
    }

    //内部设置百分比 用于动画效果
    private void setCurPercent(int percent) {

        mPercent = percent + 1;

        new Thread(new Runnable() {
            @Override
            public void run() {
                int sleepTime = 1;
                for(int i = 0;i < mPercent;i++){
                    if(i%5 == 0){
                        sleepTime+=1;
                    }
                    try {
                        Thread.sleep(sleepTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    mCurPercent = i;

                    if(mPercent > 1){
                        flag = true;
                    }else{
                        flag = false;
                    }

                    if(i == mPercent - 1){
                        endFlag = true;
                    }else{
                        endFlag = false;
                    }
                    CustomCirclePercentView.this.postInvalidate();
                }
                }

        }).start();

    }

}

attrs文件:

<declare-styleable name="CustomCirclePercentView"><!--自定义圆环进度展示attr-->
    <attr name="radius" format="dimension"/>
    <attr name="stripeWidth" format="dimension"/><!--色带宽度-->
    <attr name="percent" format="integer"/><!--百分比 最大值为100-->
    <attr name="smallColor" format="color"/><!--色带宽度颜色-->
    <!--外圈颜色-->
    <attr name="bigColor" format="color"/>
    <!--中间字体颜色-->
    <attr name="centerTextSize" format="dimension"/>
    <!--色带宽度-->
</declare-styleable>

布局文件: 布局最外层需布局指定命名空间 xmlns:app="http://schemas.android.com/apk/res-auto"

<com.joyame.sixduoa.app.widget.CustomCirclePercentView
    android:id="@+id/mCustomCirclePercentView"
    android:layout_width="200dp"
    android:layout_height="200dp"
    app:bigColor="#EFEFEF"
    app:centerTextSize="16sp"
    app:percent="45"
    app:radius="100dp"
    app:smallColor="#32DCB4"
    app:stripeWidth="10dp" />

用到的Activity调用方法:

private void setCircleProgress(int totalNumber, int punchCardNumber) { //TODO 设置圆环进度百分比
    if (totalNumber > 0 && punchCardNumber > 0) {
        mCustomCirclePercentView.setPercent((punchCardNumber / totalNumber) * 100);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Android中创建自定义圆环,可以使用Canvas和Paint类来绘制。以下是一个简单的例子: 1. 在你的XML布局文件中,添加一个自定义View: ```xml <com.example.myapp.MyCircleView android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 创建一个自定义View类,并覆盖onDraw方法: ```java public class MyCircleView extends View { private Paint paint; private RectF rectF; private float strokeWidth = 20; //圆环宽度 private float progress = 0; //进度 public MyCircleView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(strokeWidth); paint.setColor(Color.BLUE); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); rectF = new RectF(strokeWidth / 2, strokeWidth / 2, getWidth() - strokeWidth / 2, getHeight() - strokeWidth / 2); canvas.drawArc(rectF, -90, progress, false, paint); } //设置圆环进度 public void setProgress(float progress) { this.progress = progress; invalidate(); } } ``` 3. 在Activity或Fragment中使用自定义View: ```java MyCircleView myCircleView = findViewById(R.id.my_circle_view); myCircleView.setProgress(120); ``` 在此示例中,我们使用了paint对象来绘制圆环。我们还使用RectF类来确定圆环的大小和位置。最后,我们在onDraw方法中使用canvas对象来绘制圆环。我们还添加了setProgress方法,用于设置进度。 希望这可以帮助到你! ### 回答2: Android中可以通过自定义继承自View的类来实现圆环的绘制。首先,在自定义View类的构造方法中初始化画笔,并设置画笔的属性,如颜色、宽度等。然后,在自定义View类的onDraw()方法中调用canvas的drawCircle()方法,传入圆心坐标和半径参数,即可绘制出一个圆。 此外,要实现圆环的效果,可以在drawCircle()方法之前先绘制一个实心圆,再绘制一个较大的同心空心圆。可以通过设置画笔的样式为STROKE,即只画圆边缘的方式,来实现空心圆的效果。 在绘制圆环的过程中,可以利用onMeasure()方法来获取View的宽高,并动态计算圆心坐标和半径,以适应不同的屏幕尺寸。 另外,如果需要显示进度效果,可以通过设置画笔的样式为FILL,并利用drawArc()方法在圆环内部绘制一个扇形,根据进度值设置绘制的角度,来显示进度条。 最后,在使用自定义圆环的时候,可以在XML布局文件中引用该自定义View,并设置相应的属性,如颜色、宽度、进度值等。 ### 回答3: 在Android中,可以通过自定义控件来实现圆环的效果。 首先,我们可以创建一个自定义的View类,继承自View类。在自定义类中,我们需要重写onDraw()方法来绘制圆环。 在onDraw()方法中,我们可以通过Canvas类提供的drawArc()方法来绘制圆弧,从而实现圆环的效果。drawArc()方法需要指定圆弧的矩形区域、起始角度、扫过的角度和是否包含中心点。 为了实现一个圆形的圆环效果,我们可以通过计算得出圆弧的矩形区域,起始角度设置为0,扫过的角度设置为360,表示一个完整的圆环。我们还可以设置画笔的宽度、颜色等属性来控制圆环的样式。 在自定义View类中,我们还可以通过重写onMeasure()方法来控制View的大小。在该方法中,我们可以根据需求设置View的宽度和高度,使得圆环显示出来。 最后,在使用自定义圆环的布局文件中,我们可以直接将自定义View类添加到布局中。可以通过设置布局文件中的宽度、高度,以及其他属性设置来调整圆环的样式和位置。 总结起来,Android中可以通过自定义View类和重写onDraw()方法来实现圆环效果。通过计算矩形区域、设置起始角度和扫过的角度,以及设置画笔的属性,可以实现不同样式的圆环效果。最后,在布局中使用该自定义View类来显示圆环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值