mStrokeInset: 表示让RectF向上下、左右的增加或减少量,arcBounds.inset(mStrokeInset, mStrokeInset);,mStrokeInset>0是减小,mStrokeInset<0是放大,其值为: if (mRingCenterRadius <= 0 || minEdge < 0) { /*Math.ceil测试:表示大于或等于参数的最小值 var aa = Math.ceil(-10.9) println("aa是$aa") 如果<0,mStrokeInset就是画笔宽度的二分之一,而minEdge 就是这个Drawable宽高中的较小者,为什么要加小于零的判断呢? */ insets = (float) Math.ceil(mStrokeWidth / 2.0f); } else { //如果大于零,insets 就是矩形的宽高的较小者除以2减去圆环的半径 insets = (float) (minEdge / 2.0f - mRingCenterRadius); } mStrokeInset = insets; 圆的半径以及画笔的宽度 这个控件实际上是由圆环和三角形拼接起来的,那么该怎么移动三角形使之与圆环实现无缝结合就是关键了,先看一下当画一个圆环时,它的起始角度为0,偏移角度为1的时候是什么样的,入下图所示: 就是图中红线的位置,这就是起始位置,要想把画好的三角形移动到这个位置,那么该偏移多少呢,y轴很简单,偏移内切矩形圆的半径即可(bounds.exactCenterY()),那么x轴呢?理论上来讲是一个内切矩形圆的半径+圆环的半径是正确的,但是别忘了,这个矩形也做过放缩(arcBounds.inset(mStrokeInset, mStrokeInset)),那么我们在原来的基础上再减去mStrokeInset/2就对了;另一个需要清楚的问题,如下图所示: 假如红色圆环表示的是画笔的宽度,而那条灰色的线就表示圆环的半径和画笔宽度的关系。