¶控件预览
上面这个图片是最近项目中要实现的一个效果,圆弧是一个四分之一的半圆,很容易实现;但是黄色圆环部分有一部分是橘色的弧线,并且橘色弧线要和黄色圆环部分完全重合,其实如果通过改变画圆环的角度,也是可以画出橘色部分的弧线的,但是如果黄色的曲线不是圆环,而是贝塞尔曲线或者其他不规则曲线的话,要使得另外一段曲线完全和前面这段曲线某一部分完全重合的话,就需要使用PathMeasure来完成这个操作了。
¶PathMeasure相关函数
- setPath(Path path,boolean forceClosed)
- 将Path和PathMeasure进行绑定.第一个参数是传入一个Path,代表我们需要进行测量的Path,第二个参数代表是否闭合,如果一段Path不是闭合的,但是forceClosed传true的话,就会按照闭合路径来测量这一段Path,比如计算路径长度就是计算的闭合的长度,但是path本身是没有这么长的。如果本来就是闭合path,这个参数就无所谓了。
- getLength()
- 计算Path的长度
- getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo)
- 获取一段区间内的path,并生成一个新的对象,用dst来接收;第一个参数是起始长度,第二个参数是终止长度,第四个参数代表是否强制覆盖dst,如果设置为faslse,则每一次调用该方法,dst都会在已有path的基础上添加一段新path,如果设置为true,则dst会重新赋值,之前的path的值就都被覆盖了。
- nextContour()
- nextContour()方法用的比较少,比较大部分情况下都只会有一个Path而不是多个,毕竟这样会增加Path的复杂度,但是如果真有一个Path,包含了多个Path,那么通过nextContour这个方法,就可以进行切换,同时,默认的API,例如getLength,获取的也是当前的这段Path所对应的长度,而不是所有的Path的长度,同时,nextContour获取Path的顺序,与Path的添加顺序是相同的。
- getPosTan (float distance, float[] pos, float[] tan)
- 获取某个位置的坐标和正切值,分别赋值给pos和tan。
通过上面的几个方法,我们就能完成今天的demo了。
|
|
这样就完成了我们向上的抛物线箭头。
控件中还有一些其他的元素,这时候就需要给他们定位了,通过PathMeasure的getPosTan方法,我们是可以获取到所有位置的坐标的。
|
|
下面是组合控件用到的一个布局:curve_framelayout
|
|