前言
- 今天还是和往常一样,封装自己的控件库,写自定义RingRotate,我对Paint设置如下,希望他的首尾呈圆角会好看点
arcPaint.strokeCap = Paint.Cap.ROUND
- 然后设置扫描渐变
sweepGradient = SweepGradient( centerX, centerY, intArrayOf(ringEndColor,ringStartColor), null )
- draw!这本该很简单
canvas.drawArc(ringRectF, 0f, 290f, false, ringPaint)
- 可是诡异的一幕发生了,如图
- 出现了一个小尾巴
究其原因,Paint.Cap.ROUND是在尾部覆盖了一个圆角的半圆,在原有设置的RectF上加了圆角,和SQUARE一样延长了他廊
- 我对SweepGradient只设置了两个渐变色值,而这个本该是尾巴的cap,很显然他’叛变’了,正是因为突出的头触碰到边界那头,所以他的色值被切割成突兀的深蓝色
How To solve?
- 那么在原有头部色值上再追加尾部色值,使他成为一个环?,like this
sweepGradient = SweepGradient(
centerX,
centerY,
intArrayOf(ringEndColor, ringStartColor, ringEndColor), null
)
- but 有些别扭, 不是色值递减了
- 那么我对startAngle进行角度偏移呢,给这个头挪哥位置呢
- 貌似是解决了,但真的是这样吗,我再对自定义属性进行修改,改变他的线宽
app:ringRotate_ringWidth="60dp"
- 但是,很显然这是不对的
- 初中的知识了,虽然忘了…借用数学~
- 明白了解决的思路,我们用强大的Math库,这里用到asin(),来计算他的角度偏移量,注意asin只是计算出弧度值,我们需要转换为角度toDegree()
angleOffset =
Math.toDegrees(asin(ringWidth / 2f / (realRadius - ringWidth / 2f)).toDouble()).toFloat()
- 这一次成功了!



