圆形百分比进度条(避坑笔记)
最近在写项目的时候发现要写一个圆形进度条,本来想着自己写一个吧,写完后发现有坑啊,关键是还是一个大坑,项目中使用的刷新控件是WaterDropListView然后发现进度条显示的数据一直有问题,一开始以为是自己数据的问题,经过一系列的断点调试才发现问题是出在了进度条的绘制上。
迫不得已只好寻找第三方来填坑,最终发现了一个名为CirclePercentView的圆形进度条,哈哈,这下可以解决我的问题了吧,这下开心了,等等,这是什么鬼
文章图片
这里写图片描述
进度的确出来了,可为什么显示的值不对呢?原数据是 0、10、12、4、,怎么现在全部少了1,找呀找呀发现了
CirclePercentView类中的实现方法中有这么一段
//内部设置百分比 用于动画效果
private void setCurPercent(int percent) {
mPercent = percent;
new Thread(new Runnable() {
@Override
public void run() {
int sleepTime = 20;
for (int i = 0;
i < mPercent;
i++) {
if (i % 20 == 0) {
sleepTime += 2;
}
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
mCurPercent = i;
CirclePercentView.this.postInvalidate();
}
}}).start();
}
for (int i = 0; i < mPercent; i++)
mCurPercent = i;
你发现了吗?就是因为在循环的时候判断条件是小于当前的mPercent,所以会造成一直比原来的值小1,更改的方法就是就是让其小于等于即可。for (int i = 0; i <= mPercent; i++)
现在就可以了,还有个小问题,咦,怎么圆形中的文字没有居中呢?老规矩,上代码:
//绘制文本
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);
具体的设置就是drawText了,这样其实并没有很好的做居中的适配判断,本人稍微改了下。如觉得还未居中的算法可以自己调整
Paint textPaint = new Paint();
String text = mCurPercent + "%";
textPaint.setTextSize(mCenterTextSize);
textPaint.setColor(mSmallColor);
float textWidth = textPaint.measureText(text);
float textHeight = (textPaint.descent() + textPaint.ascent()) / 2;
canvas.drawText(text, mRadius - textWidth / 2, mRadius - textHeight, textPaint);
现在看上去还算可以的了,当然如果你想更准确的话就需要更精密的计算了。
ok,到这里效果也完成的差不多了,这个就是我在用第三方控件的时候遇到的一些问题。具体使用:
【圆形百分比进度条(避坑笔记)】好了,其他的没有了,最后安利下另一个进度条的控件:
CircleProgressBar
传送门:
https://github.com/dinuscxj/CircleProgressBar
效果看起来不错,具体的自己实践吧!!!
推荐阅读
- Android自定义view实现圆环进度条效果
- Flutter自定义view|Flutter自定义view —— 闯关进度条
- 圆形菜单
- vue|vue canvas 手绘进度条动画
- 如何使用pace.js美化你的网站加载进度条详解
- 4.23阅读
- React|React Native实现一个渐变进度条
- 太好玩了!6种Python实现【实时】显示进度条!
- Android可显示数字进度的进度条使用教程
- UE4虚幻4学习|制作血条/蓝条/蓄力条等进度条(Progress Bar)