Android PathMeasure总结

2020-04-02  本文已影响0人  刘小厨

概述: PathMeasure 路径测量,一个用来测量Path的工具类

PathMeasure的常用Api包括 Path长度测量,Path跳转,Path片段获取 等..

先看下PathMeasure的两个构造方法:

  1. 无参构造: 无参构造可以实例化一个PathMeasure对象,但是不能直接使用, PathMeasure需要关联一个创建好的Path对象,可以使用PathMeasure.setPath(Path path,boolean forceClosed)传入创建好的Path对象
PathMeasure pathMeasure = new PathMeasure();
  1. 有参构造:有参构造需要传入一个创建好的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:

  1. pathMeasure1.getLength() : 获取关联path的长度,使用注意的点在上面构造方法的地方已经注明.

  2. boolean getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo):用于截取path片段.
    返回值表示是否截取成功,startDstopD表示开始/结束截取位置距离path起始点的距离的,会将截取结果存放在dst中,最后一个参数startWithMoveTo表示起始点是否使用MoveTo移动 ,用于保证截取path的第一个点位置不变

注:getSegment()方法不会改变dst原有路径

  1. 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]);
getPosTan

Log信息为:

E/TAG: onDraw: pos[0]=200.0;pos[1]=0.0
E/TAG: onDraw: tan[0]=0.0;tan[1]=1.0

为了解释上面tan[]值得意思,我们看下面两张图

切线与x轴夹角=90°

然后我们看下这个夹角在单位圆内邻边/对边所对应的关系

`邻边=OA 对边=AB`

或者可以理解为,在单位圆内,对应的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小案例-箭头沿环形路径旋转

上一篇下一篇

猜你喜欢

热点阅读