做progress的时候使用CountDownTimer做倒计时刷新绘制,new CountDownTimer传入总时长long类型,onTick回调剩余时长long类型,progress定义int类型用于刷新进度条绘制,如下:
// CountDownTimer机制,启动时间会被算入,所以加入100ms的默认时间
mTimer = new CountDownTimer(mTimeMillis + 100, 1000) {
@Override
public void onTick(long millisUntilFinished) {
if (mProgressShow) {
mProgress = (int) (millisUntilFinished * 100 / mTimeMillis + 0.5);
postInvalidate();
}
}
@Override
public void onFinish() {
}
}.start();
发现在页面第一次被打开刷新绘制的时候progress为99,圆形进度条没有闭合,肯定有问题。于是在每个postInvalidate的地方打了log,确认了是第一次onTick的时候progress是99,刷新绘制导致的。
排查结果发现,剩余时长/总时长,得到的结果是99,+0.5变成99.5,转成int又变成了99,没有起到四舍五入的效果。
这里是因为long是整型,long/long和int/int一样,整型相除得到整型,会把小数点直接忽略,因此四舍五入自然也没有效果。
把*100变成*100f,手动转成float类型,带小数点后+0.5完成四舍五入再转成int,解决。
字节型:byte
字符型:char
整型:short(短整型),int(整型),long(长整型),long long
浮点型:float(单精度浮点型),double(双精度浮点型)
布尔型:boolean