概述: PathMeasure 路径测量,一个用来测量Path的工具类
PathMeasure
的常用Api包括 Path长度测量,Path跳转,Path片段获取 等..
先看下PathMeasure
的两个构造方法:
- 无参构造: 无参构造可以实例化一个
PathMeasure
对象,但是不能直接使用,PathMeasure
需要关联一个创建好的Path对象,可以使用PathMeasure.setPath(Path path,boolean forceClosed)
传入创建好的Path对象
PathMeasure pathMeasure = new PathMeasure();
- 有参构造:有参构造需要传入一个创建好的
Path
对象,第二个参数为forceClosed
,会影响Path的测量结果,传入true表示将path路径闭合
PathMeasure pathMeasure = new PathMeasure();
//如果Path进行了调整,需要重新调用setPath方法进行关联
pathMeasure .setPath(path, false);
注:
如果在pathMeasure .setPath(path, false)
之后,path对象进行更改(如 path.lineTo(200, -200);
), pathMeasure
需要重新调用setPath()
方法,否则pathMeasure1.getLength()
获取到的值是之前的值
常用Api:
-
pathMeasure1.getLength()
: 获取关联path的长度,使用注意的点在上面构造方法的地方已经注明. -
boolean getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo)
:用于截取path片段.
返回值表示是否截取成功,startD
和stopD
表示开始/结束截取位置距离path起始点
的距离的,会将截取结果存放在dst
中,最后一个参数startWithMoveTo
表示起始点是否使用MoveTo
移动 ,用于保证截取path的第一个点位置不变
注:getSegment()方法不会改变dst原有路径
-
boolean nextContour()
: 表示跳转到下一个Path路径,返回值表示跳转是否成功,效果如下:
Path path = new Path();
path.addRect(-100,-100,100,100, Path.Direction.CW);//添加一个矩形
path.addOval(-200,-200,200,200, Path.Direction.CW);//添加一个椭圆
PathMeasure pathMeasure = new PathMeasure(path, false);
Log.e("TAG", "矩形"+ pathMeasure.getLength());
//跳转到下一条曲线
pathMeasure.nextContour();
Log.e("TAG", "椭圆"+ pathMeasure.getLength());
4.boolean getPosTan(float distance, float pos[], float tan[])
: 获取距离path起始点
距离为distance
的点的坐标
和tan值
,坐标x,y信息存放在pos[]
数组中,tan[]
数组表示的是当前点在曲线的方向
, tan[0]
表示该点与曲线的切线与x轴的夹角,邻边长度; tan[1]
表示该点与曲线的切线与x轴的夹角,对边长度长度;
mPath.addCircle(0,0,200, Path.Direction.CW);
canvas.drawPath(mPath, mPaint);
PathMeasure pathMeasure = new PathMeasure(mPath, false);
pathMeasure.getPosTan(0,pos,tan);
Log.e("TAG", "onDraw: pos[0]="+pos[0]+";pos[1]="+pos[1]);
Log.e("TAG", "onDraw: tan[0]="+tan[0]+";tan[1]="+tan[1]);
![](https://img.haomeiwen.com/i11952059/5cb34cba62bccde7.png)
Log信息为:
E/TAG: onDraw: pos[0]=200.0;pos[1]=0.0
E/TAG: onDraw: tan[0]=0.0;tan[1]=1.0
为了解释上面tan[]
值得意思,我们看下面两张图
![](https://img.haomeiwen.com/i11952059/a3100afa874757c2.png)
然后我们看下这个夹角在单位圆内邻边/对边所对应的关系
![](https://img.haomeiwen.com/i11952059/f42c2a048cc7c82c.png)
或者可以理解为,在单位圆
内,对应的x,y坐标
通过这个getPosTan()
这个方法我们拿到tan[]数组
后,就可以通过数学公式获取到当前点与path曲线的切线
与X轴
夹角得的角度
公式是这样的:
//计算出当前的切线与x轴夹角的度数(存在数据精度问题比如45度夹角的切线求出来大概是:degrees=45. 00003622254719)
double degrees = Math.atan2(tan[1], tan[0]) * 180.0 / Math.PI;
运用PathMeasure实现的小案例见:
Android PathMeasure小案例-箭头沿环形路径旋转
网友评论