最近准备系统学习一下Android知识,Path操作时遇到一个比较难理解的类
PathMeasure
,一番研究(百度一下),记录一下自己的理解。在此特别感谢GcsSloop
同学的博文,对于 Android 自定义 view 知识写的很好,收益匪浅。博客地址:GcsSloop.com
时间有限(懒癌犯了~~),PathMeasure的基本方法像,
构造函数
、getength
、setPath
等就不详细介绍了,很简单哟。本期重点两个方法getSegment
、getPosTan
boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo)
作用:用于获取 Path 某一片段,获取成功后返回 TRUE。
参数 | 作用 |
---|---|
startD | 开始截取位置距离 Path 起点的长度(非负) |
stopD | 结束截取位置距离 Path 起点的长度 |
dst | 截取的 Path 将会添加到 dst 中 |
startWithMoveTo | TRUE:保证截取得到的 Path 片段不会发生形变。 |
使用详解:
startD
和stopD
与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);
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坐标 |
使用详解:
说明:
角 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]
=cosA
和tan[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 的总结,非常感谢GcsSloop,学到很多。