CircleProgressBar在xml文件中无法预览出圆形效果
# 具体遇到的问题
xml存入CircleProgressBar无法预览出圆形效果,是一个方形(即画图区域)
# 报错信息的截图
# 相关课程内容截图
这是预览效果,没有圆形,是方形的
# 尝试过的解决思路和结果
# 粘贴全部相关代码,切记添加代码注释(请勿截图)
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无效,重新绘制图形
}
}
}在这里输入代码,可通过选择【代码语言】突出显示
6
收起
正在回答 回答被采纳积分+1
3.Android 高级应用与Kotlin综合实战
- 参与学习 人
- 提交作业 116 份
- 解答问题 1012 个
本阶段是提升项目经验的必备,除Android开发的高级控件,还有Android官方大力推荐的开发语言Kotlin,未来Android发展的方向,最后使用Kotlin来开发热门电商项目。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星