PathMeasure
PathMeasure的创建方式有两种
第一种: new PathMeasure,还后通过setPath方法将Path和PathMeasure绑定
第二种: new PathMeasuer的时候将path传入,直接绑定。
在绑定Path的时候,有个参数,forceClosed,如果传入true,不管Path是否close,都会自动帮你在计算的时候close Path。但是Path本身不受影响。如果传入的是false,就看Path本身是否有close。
getLength
该方法获取路径长度。
isClosed
判断Path是否闭合,如果forceClosed传入true这里必然返回true。
nextContour
因为Path中可能存在多条曲线,但是上面的方法都是针对第一条曲线,所以这里可以调用nextContour方法,移动到第二条,第三条曲线。如果移动成功,会返回true,如果失败返回false。
getSegment
该方法会截取Path中某个片段。
public boolean getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo)
- startD:截取长度开始
- stopD:截取长度结束
- dst:截取的Path会添加到dst中
- startWithMoveTo:起始点是否使用moveTo将新路径的起始点移动到原始Path的起始点。 使用过程中需要关闭硬件加速。
原始Path在绘制的时候如果设置了绘制是顺时针还是逆时针,那么在截取路径的时候也会是顺时针或者逆时针。所以截取路径方向和路径生成方向相同。
调用getSegment方法后是在dst中添加Path,而不是覆盖原有Path。
为了方便理解startWithMoveTo,下面两个图片来解释下:
这个是startWithMoveTo填写的true,新的path和原来的path是同一个起始点,所以画出来的path就相对完整。
当我们吧startWithMoveTo填写为false的时候,新path会继续上一个path的终点开始画,就会变成这样。
getPosTan
方式是获取路径上,一个距离的点和坐标原点的切线。
public boolean getPosTan(float distance, float pos[], float tan[])
- distance:path上的距离,0 < distance < getLength()
- pos[]:该距离坐标的数据,pos[0]是x轴坐标,pos[1]是y轴坐标
- tan[]:该坐标的切线的值,这里返回的是一个数组。通过返回的值可以求的该切线的正切值。
在调用getPosTan方法的时候,pos和tan是要提前创建,然后传入进去,方法中会给他们赋值。
几何上,切线指的是一条刚好触碰到曲线上某一点的直线。更准确地说,当切线经过曲线上的某点时,切线的方向与曲线上该点的方向是相同的。平面几何中,将和圆只有一个公共交点的直线叫做圆的切线。
上图中就表示了一个点的切线,getPosTan就是获取该点一个方向上的切线,角C就是正切值。
Math中有两个方法,可以求反正切函数。
- double atan(double d)
- double atan2(double y,double x) 如果使用第二个函数,就是:
val degrees = atan2(tan[1],tan[0]) * 180 / Math.PI
因为atan2获取的是夹角对应的弧度,一个圆取值范围是[-Math.PI,Math,PI],所以这里通过计算得到的degress几十角度。
SVG动画
SVG是矢量图,由一个个点组成,经过计算利用直线和曲线绘制而成,所以无论如何放大,不会出现马赛克现象。
矢量图占用空间比位图也会小很多。
Bitmap就是位图,由像素组成,所以放大很多后会出现马赛克现象。
SVG可以转换为Path,与Path动画结合,更好
Android中对SVG的支持并没有使用SVG原有的rect,circle,line等标签,而是使用path标签,几乎可以实现SVG中其他所有标签的功能。
下面是一张矢量图:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#51D755"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector>
vctor标签
vctor标签指定这是一副svg图像,其中with和height指定的是svg图像的具体大小。viewportWidth和viewportHeight指定的是svg的比例。
因为svg是通过点来画的,所以viewportWidth和viewportHeight其实是说x轴和y轴有多少个点。假如width和height都是100,viewportWidth和viewportHeight也都是100,那么[1,1]这个点对应的就是正常坐标系的[1,1],如果viewportWidth和viewportHeight都是50,代表每个点距离是2,所以[1,1]代表的是正常坐标系的[2,2]。
所以vector主要是用来制定画布大小的。
path标签
path标签是指定路径内容的,主要属性:
group标签
group标签可以定义一个或者很多路径,或者将path标签分组。
svg动画
如果要使用svg动画,需要先用vctor标签生产svg,然后用objectAnimator标签指定svg动画需要改变的属性。最后用animated-vector标签将svg和动画绑定起来。这分别是三个xml文件。
最后在代码调用的时候:
假如svg中有多个path,我们可以分别控制每一个path的动画,有兴趣的可以自己网上看看。