PathMeasure 重点方法详解(文章有错,待校正)

PathMeasure 重点方法详解

最近准备系统学习一下Android知识,Path操作时遇到一个比较难理解的类PathMeasure,一番研究(百度一下),记录一下自己的理解。在此特别感谢GcsSloop同学的博文,对于 Android 自定义 view 知识写的很好,收益匪浅。博客地址:GcsSloop.com

知识点

时间有限(懒癌犯了~~),PathMeasure的基本方法像,构造函数getengthsetPath等就不详细介绍了,很简单哟。本期重点两个方法getSegmentgetPosTan

getSegment方法

boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo)

作用:用于获取 Path 某一片段,获取成功后返回 TRUE。

参数 作用
startD 开始截取位置距离 Path 起点的长度(非负)
stopD 结束截取位置距离 Path 起点的长度
dst 截取的 Path 将会添加到 dst 中
startWithMoveTo TRUE:保证截取得到的 Path 片段不会发生形变。

使用详解:

startDstopD与Path 的绘制顺序有关。

    Path path1 = new Path();
    
    path1.addRect(-200,-200,200,200, Path.Direction.CW);
    
    //设置目标 Path
    Path dst = new Path();
    //创建 PathMeasure 对象
    PathMeasure pm = new PathMeasure(path1,false);
    
    //获取片段
    //作为矩形,绘制起点在左上角
    //当 startD 为0时,起始点在矩形的左上角
    //大于0时,按绘制方向移动对应距离
    pm.getSegment(0,300,dst,true);
    
    canvas.drawPath(dst,paint);

getPosTan方法

boolean getPosTan(float distance, float pos[], float tan[])
参数 作用
distance 距离 Path 起点的长度 取值范围: 0 <= distance <= getLength
pos[] 该点的坐标值,pos[0]为x坐标、pos[1] 为y坐标
tan[] 该点的正切值,tan[0]对应角度的cos值,对应X坐标。tan[1] 对应角度的sin值,对应Y坐标

使用详解:

distancepos[]比较容易理解,但是tan[]参数让我郁闷了一段时间,看下面的推演图示可能比较容易理解。PathMeasure 重点方法详解(文章有错,待校正)_第1张图片

说明:
角 A 的正切值 tanA = P.y/P.x
P 点坐标为(P.x,P.y)
P 点的横坐标 P.x = cosA * 斜边
P 点的纵坐标 P.y = sinA * 斜边
所以最后我们的 tanA 的值为tanA=sinA/cosA
所以我们 tan[]数组中存放的分别是 tan[0]=cosAtan[1]=sinA的值。

使用详解:

    //当前进度
    currentPos += 0.005;
    if (currentPos >= 1) {
        //大于1重置
        currentPos = 0;
    }
    Path path = new Path();
    //圆形背景
    path.addCircle(0, 0, 200, Path.Direction.CW);
    
    PathMeasure pm = new PathMeasure(path, false);
    //获取当前长度的坐标集合和正切值集合
    pm.getPosTan(pm.getLength()*currentPos,pos,tan);
    
    //根据pos 集合中的位置绘制圆
    canvas.drawCircle(pos[0],pos[1],15,mPaint);
    //绘制背景圆 Path
    canvas.drawPath(path,mPaint);

    //刷新布局  
    invalidate();

对于 tan[]数组,描述的是当前点的切线与 x 轴夹角的tan 值,我们通常结合 Math.atan2方法来计算旋转角度。

下图说明:绿色箭头表示切线,当处于点(2,0)时,切线于水平方向夹角为90°,tan[0]=cos90=0,tan[1]=sin90=1。
所以,getPosTan 方法中 返回的tan[]数组描述的是当前点的切线与水平线夹角的 tan 值。tan[0]为角 A的cos值 , tan[1]为角 A 的 sin 值
对于 Math.atan2方法,是根据传入的x,y 坐标,计算与原点之间的夹角弧度。
即:弧度 A = Math.atan2(P.y,P.x)
P.x 和 P.y 又可以分别用 cosA 和 sinA 来表示。结合 getPosTan 方法我们就可以改成:弧度 A = Math.atan2(tan[1],tan[0])
角度 A = 弧度 A*180/Math.PI
PathMeasure 重点方法详解(文章有错,待校正)_第2张图片

以上就是对 PathMeasure 的总结,非常感谢GcsSloop,学到很多。

你可能感兴趣的:(Android杂记)