CircleProgressBar在xml文件中无法预览出圆形效果

CircleProgressBar在xml文件中无法预览出圆形效果

# 具体遇到的问题
xml存入CircleProgressBar无法预览出圆形效果,是一个方形(即画图区域)
# 报错信息的截图

# 相关课程内容截图

这是预览效果,没有圆形,是方形的
http://img1.sycdn.imooc.com//climg/5fa1119609dc53be03590629.jpg# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

package com.example.widgets;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
/*自定义view*/
public class CircleProgressBar extends View {
private int progress = 0;
private int maxProgress = 100;
//    绘图的Paint
   private Paint pathPaint;//路径paint
   private Paint fillPaint;//填充paint
   /*绘制的矩形区域*/
   private RectF oval;
//    进度条颜色是圆形渐变的
   private int[] arcColors = {0xFF02C016, 0xFF3DF346, 0xFF40F1D5, 0xFF02C016};
//    背景灰色
   private int pathColor = 0xFFD2D1C4;
//    边框灰色
   private int borderColor = 0xFFD2D1C4;
/*圆形进度条参数设置*/
//  路径宽度
   private int pathWidth = 35;
private int width;
private int height;
private int radius = 120;
//梯度渲染
   private SweepGradient sweepGradient;
//    重置标志,重新绘制标志
   private boolean reset = false;
//构造函数,初始化画笔,绘制区域oval=RectF()
   public CircleProgressBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
/*初始化绘制*/
       /*路径画笔*/
       pathPaint = new Paint();//定义画笔
       pathPaint.setAntiAlias(true);//防锯齿
       pathPaint.setFlags(Paint.ANTI_ALIAS_FLAG);//抗锯齿标志
       pathPaint.setStyle(Paint.Style.STROKE);//空心笔触
       pathPaint.setDither(true);//防抖动
       pathPaint.setStrokeJoin(Paint.Join.ROUND);//圆角
       /*填充画笔*/
       fillPaint = new Paint();//定义画笔
       fillPaint.setAntiAlias(true);//防锯齿
       fillPaint.setFlags(Paint.ANTI_ALIAS_FLAG);//抗锯齿标志
       fillPaint.setStyle(Paint.Style.STROKE);//空心笔触
       fillPaint.setDither(true);//防抖动
       fillPaint.setStrokeJoin(Paint.Join.ROUND);//圆角
       oval = new RectF();//绘制区域
   }
/*        绘图
* (1)绘制灰色圆圈背景路径
* 2)绘制渐变色的圆圈1,覆盖背景路径的靠外一半粗细和外圈0.5f
* (2)绘制渐变色的圆圈2,覆盖背景路径的靠内一半粗细和内圈0.5f*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//        需要绘制标识=true
       if (reset) {
//            画布绘制颜色
           canvas.drawColor(0xFFFFFFFF);
//            重绘标识=false
           reset = false;
}
width = getMeasuredWidth();//绘图宽度
       height = getMeasuredHeight();//绘图高度
       radius = getMeasuredWidth() / 2 - pathWidth;//半径=绘图宽度一半   减去 画笔宽度
//    设置圆的背景颜色 (路径)
       pathPaint.setColor(pathColor);
//    设置画笔宽度
       pathPaint.setStrokeWidth(pathWidth);
//    绘制圆形背景路径 (灰色)     画圆参数:X轴起始点,Y轴起始点,半径,画笔
       canvas.drawCircle(width / 2, height / 2, radius, pathPaint);
//    圆形进度条画笔粗细
       fillPaint.setStrokeWidth(0.5f);
//设置圆的背景颜色 (路径)
       fillPaint.setColor(borderColor);
/*进度条画圆圈*/
//画圆,粗细=在背景路径粗细的一半和外圈0.5f  ,保证覆盖路径外半圆圈
       canvas.drawCircle(width / 2, height / 2, (radius + pathWidth / 2) + 0.5f, fillPaint);
//画第二个圆,粗细=背景路径粗细的一半和内圈0.5f保证覆盖路径背景内半圆圈
       canvas.drawCircle(width / 2, height / 2, (radius - pathWidth / 2) - 0.5f, fillPaint);
//        设置颜色梯度渐变
       sweepGradient = new SweepGradient((width / 2), height / 2, arcColors, null);
fillPaint.setShader(sweepGradient);//画笔着色器为渐变梯度色
       fillPaint.setStrokeCap(Paint.Cap.ROUND);//画笔线头=线帽,线帽圆形
//   画布大小
       oval.set(width / 2 - radius, height / 2 - radius, width / 2 + radius, height / 2 + radius);
//        画弧 :画布,开始角度,终止角度,是否有中心点,画笔
       canvas.drawArc(oval, -90.0f, (progress / maxProgress) * 360.0f, false, fillPaint);
}

//实现View大小的测量方法:宽和高
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = MeasureSpec.getSize(heightMeasureSpec);//获取测量高度
       int width = MeasureSpec.getSize(widthMeasureSpec);//获取测量宽度
       setMeasuredDimension(width, height);//设置View的大小


   }

public int getProgress() {
return progress;
}

public void setProgress(int progress) {
this.progress = progress;
invalidate();//UI区域的CircleProgressBar无效,重新绘制图形
   }

public int getMaxProgress() {
return maxProgress;
}

public void setMaxProgress(int maxProgress) {
this.maxProgress = maxProgress;
invalidate();//UI区域的CircleProgressBar无效,重新绘制图形
   }

public int getPathColor() {
return pathColor;
}

public void setPathColor(int pathColor) {
this.pathColor = pathColor;
}

public int getBorderColor() {
return borderColor;
}

public void setBorderColor(int borderColor) {
this.borderColor = borderColor;
}

public int getPathWidth() {
return pathWidth;
}

public void setPathWidth(int pathWidth) {
this.pathWidth = pathWidth;
}

public boolean isReset() {
return reset;
}

public void setReset(boolean reset) {
this.reset = reset;
//        需要重置,即重新绘图
       if (reset) {
progress = 0;//起始进度0
           invalidate();//UI区域的CircleProgressBar无效,重新绘制图形
       }
}


}

在这里输入代码,可通过选择【代码语言】突出显示

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕雪 2020-11-03 17:39:54

同学你好,这个没有问题,你要看显示的内容,而不是看鼠标选中的形状。

  • 提问者 慕运维0750787 #1
    老师,你没有理解 我说的是CircleProgressBar,是这个圆形图片后的灰色圆圈背景没有出来
    2020-11-04 11:15:09
  • 提问者 慕运维0750787 #2
    已经解决了,重新rebuild可以出来
    2020-11-04 11:24:34
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师